Fabyo 66 Denunciar post Postado Dezembro 26, 2005 Como tem bastante gente com duvidas sobre descompactar um arquivo zip fiz essa função pra ajudar http://br2.php.net/zip 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; } if ($zip = zip_open(getcwd(). "\\$file")) { if(!file_exists(basename($file, ".zip"))) { 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); } else return false; } //modo de usar: unzip("file.zip"); ?> Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Dezembro 29, 2005 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. Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Dezembro 29, 2005 beleza Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Dezembro 29, 2005 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;} Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Dezembro 29, 2005 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 Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Dezembro 30, 2005 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;} ;) Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Dezembro 30, 2005 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: Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Setembro 13, 2006 Resurgindo das cinzas... :DTive que fazer algumas mudanças para funcionar aqui. Eu zipei a pasta inteira.Em linux né? Compartilhar este post Link para o post Compartilhar em outros sites