Zip uitpakken
Met deze functie kan je een zip-bestandje uitpakken. Het enige dat je de functie hoeft te vertellen is welk zip-bestandje uitgepakt moet worden, en waar het naartoe uitgepakt moet worden. Ik was op zoek naar zo'n functie, maar ik kon alleen scripts vinden die geen directories ondersteunen. Met deze functie kan je je directories oneindig diep nesten. Ik heb het geschreven, omdat bij mijn webhost je alleen bestanden één voor één kunt uploaden (of met ftp, natuurlijk). Nu kan ik gewoon een heleboel bestanden, of gewoon een hele website, inpakken naar een zip-bestandje, dat uploaden, en met deze functie het zip-bestandje op de server laten uitpakken. Het zal vast wel beter/efficiënter kunnen, dus commentaar is altijd welkom ;) Edit's: Zie onderaan
[b]Dit is de functie:[/b]
[code]<?php
function extract_zip($zip_file, $to_path = '.') {
// Check if $to_path exists
if ( ! chdir($to_path)) {
return false;
}
$absolute_to_path = getcwd();
chdir(dirname(__FILE__));
// Open zip file
if ( ! $zip = zip_open($zip_file)) {
return false;
}
// Check each item in zip file
while ($entry = zip_read($zip)) {
// Check if it's not a directory
if (zip_entry_filesize($entry) != 0) {
$parts = explode('/', $zip_entry_name($entry));
$filename = array_pop($parts);
$path = count($parts) == 0 ? '.' : implode('/', $parts);
chdir($absolute_to_path);
// Create directory
if (! is_dir($path) && ! mkdir($path, 0777, true)) {
return false;
}
chdir($path);
// Save file
if (! zip_entry_open($zip, $entry)) {
return false;
}
if (file_put_contents($filename, zip_entry_read($entry)) === false) {
return false;
}
zip_entry_close($entry);
}
}
// close zip file
zip_close($zip);
// return true when no error occured
return true;
}
?>[/code]
[b]Je kunt de functie zo gebruiken:[/b]
[code]<?php
extract_zip('zipfile.zip', 'path/where_to/extract');
?>[/code]
[b]Edit:[/b]
De efficiëntie verbeterd.
[code]<?php
$filename = strrchr(zip_entry_name($entry), '/');
$path = str_replace($filename, '', zip_entry_name($entry));
$filename = substr($filename, 1);
if ($filename == '') {
$filename = $path;
$path = '.';
}
?>[/code]
veranderd in:
[code]<?php
$parts = explode('/', $zip_entry_name($entry));
$filename = array_pop($parts);
$path = count($parts) == 0 ? '.' : implode('/', $parts);
?>[/code]
Reacties
0