Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Como tem bastante gente com duvidas sobre descompactar um arquivo zip fiz essa função pra ajudar
CXL. Zip File Functions (Read Only Access) ( Somente leitura)
Observe que a ZZIPlib provem apenas uma biblioteca de funções para ler arquivos ZIPados
para baixar essa dll baixe ela aqui http://pecl.php.net/package/zip ou baixe logo o pacote completo do pecl no http://php.net/downloads
descomente a linha do php.ini: extension=php_zip.dll se ela nao existir crie ela
a função que descompacta:
<?
function unzip($file)
{
if(pathinfo($file, PATHINFO_EXTENSION) != "zip") {
return false;
} mkdir(basename($file, ".zip"));
}
while ($zip_entry = zip_read($zip)) {
if (zip_entry_open($zip, $zip_entry, "r")) {
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
$dir_name = dirname(zip_entry_name($zip_entry));
if ($dir_name != ".") {
$dir_op = getcwd(). "\\$file/";
foreach ( explode("/", $dir_name) as $k) {
$dir_op = $dir_op . $k;
if (is_file($dir_op)) unlink($dir_op);
if (!is_dir($dir_op)) mkdir($dir_op);
$dir_op = $dir_op . "/";
}
}
$fp = fopen(basename($file, ".zip")."/" .zip_entry_name($zip_entry), "w");
fwrite($fp, $buf);
zip_entry_close($zip_entry);
} else
return false;
}
zip_close($zip);return false;
}
//modo de usar:
unzip("file.zip");
?>beleza
Finalmente terminei, tava quebrando a cabeça pra descobrir o que era uma pasta e o que era um arquivo dentro do zip, as funções is_dir e is_file só dão TRUE se a pasta (ou arquivo) existirem. Então descobri uma coisa meio óbvia e usei. Quando é uma pasta, o zip_entry_read() retorna false, simples assim. O resto que eu mudei é fácil de entender a lógica. Pelo menos no que eu testei aqui funcionou. Aí está:
function unzip($file){ if(pathinfo($file, PATHINFO_EXTENSION) != "zip") { return false; } if ($zip = zip_open(getcwd(). "\\".$file)) { if(!file_exists($basename=basename($file, ".zip"))) { mkdir($basename); } while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry, "r")) { $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); $dir_name = zip_entry_name($zip_entry); $isdir = !$buf; if ($isdir && !is_dir($dir_name)) { mkdir($basename."\\".$dir_name); continue; } else if (file_exists($dir_name)) unlink ($dir_name); $fp = fopen($basename."/" .zip_entry_name($zip_entry), "w"); fwrite($fp, $buf); zip_entry_close($zip_entry); } else return false; } zip_close($zip); } else return false;}
Alisson apareceu outros erros mas vou ver só o ano que vem agora = )
o 1 erro é quando tem uma pasta dentro de outra pasta ele da erro
tipo assim quando foi zipada uma pasta e nao or arquivos
2 erro seu script ta apagando o proprio script unzip.php = )
bom depois eu vejo com calma t+
ah só pra você ver, se você zipar o unzip.php junto quando você rodar o unzip ele apaga o unzip.php que ta rodando tbm = )
exemplo file.zip => dentro do file.zip tem uma copia do unzip.php, dai se roda o unzip ele apaga o unzip.php que ta rodando
Cara, o primeiro erro que você falou aqui não deu não, descompactou certinho, mesmo com sub-pastas, sub-sub-pastas, etc.
O 2° erro é verdade mesmo hehehe, esqueci de um pequeno detalhe, correção:
function unzip($file) { if(pathinfo($file, PATHINFO_EXTENSION) != "zip") { return false; } if ($zip = zip_open(getcwd(). "\\".$file)) { if(!file_exists($basename=basename($file, ".zip"))) { mkdir($basename); } while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry, "r")) { $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); $dir_name = zip_entry_name($zip_entry); $isdir = !$buf; if ($isdir && !is_dir($dir_name)) { mkdir($basename."\\".$dir_name); continue; } else if (file_exists($basename."\\".$dir_name)) unlink ($dir_name); $fp = fopen($basename."/" .zip_entry_name($zip_entry), "w"); fwrite($fp, $buf); zip_entry_close($zip_entry); } else return false; } zip_close($zip); } else return false;}
;)Voltando ao primeiro erro que o Fabyo disse. Quando você compactava uma pasta, com nome "teste" por exemplo", e deixava o arquivo zip com o mesmo nome "teste" ele não criava o diretório. O arquivo zip já cria uma pasta no começo, tentava criar uma pasta com o mesmo nome (a pasta que está dentro do zip) no mesmo dir. Eu estava esquecendo de colocar a url dessa pasta que o zip criava para ser criado a nova pasta dentro desta e não no mesmo diretório. Código corrigido:
function unzip($file) { if(pathinfo($file, PATHINFO_EXTENSION) != "zip") { return false; } if ($zip = zip_open(getcwd(). "\\".$file)) { if(!file_exists($basename=basename($file, ".zip"))) { mkdir($basename); } while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry, "r")) { $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); $dir_name = $basename."\\".zip_entry_name($zip_entry); $isdir = !$buf; if ($isdir) { mkdir($dir_name); continue; } else if (file_exists($dir_name)) unlink ($dir_name); $fp = fopen($dir_name, "w"); fwrite($fp, $buf); zip_entry_close($zip_entry); } else return false; } zip_close($zip); } else return false;}
Se tiver mais algum erro é só falar. :natalwink:
Resurgindo das cinzas... :DTive que fazer algumas mudanças para funcionar aqui. Eu zipei a pasta inteira.
Em linux né?
Bom, legal, mas eu fiz alguns testes e achei um erro, quando o arquivo zip contém subpastas, e a partir do dir do zip ele fica com o dir como por exemplo pasta1/pasta2/pasta3, ele tenta criar um arquivo com nome pasta3, isso ocorre pq você pega somente o diretório onde essa pasta se encontra com o dirname(). Vou tentar consertar, depois eu posto.