Descompactar arquivos com PHP


1 Estrelas2 Estrelas3 Estrelas4 Estrelas5 Estrelas (13 votos, média: 4.77 de 5)
Loading ... Loading ...

Ola pessoal tudo bom?

Hoje vou postar mais uma dica: Como descompactar um arquivo ZIP com PHP.

Desenvolvi um sistema no qual os usuários trabalham com arquivos de texto muito grandes(acima de 20mb), ai neste caso, eles sempre ficam com os arquivos zipados na máquina… facilitando no caso de mandar para algum e-mail e etc…

Pensando nisso eu fiz com que eles pudessem fazer o upload dos arquivos zipados para o sistema e em uma tela eu exibia uma prévia(os nomes) do(s) arquivo(s) que estão dentro do ZIP.

Neste servidor eu instalei a versão 5.2.8 do PHP com todas as extenções, logo, não precisei configurar nada para funcionar.

Vamor para o código:

  1. <?
  2. /**
  3.  * Esta função retorna um array com
  4.  * os nomes dos arquivos que estão
  5.  * dentro do zip.
  6.  *
  7.  * @param String $path: Local do arquivo .zip
  8.  * @return array ou false no caso de erro
  9.  */
  10. function zipToArray($path){
  11.     # ===— Instancia a classe
  12.     $zip = new ZipArchive;
  13.     # ====– Tenta abrir o zip
  14.     if($zip->open($path)){
  15.         # ===— Recupera o numero de arquivos do zip
  16.         $num_files = $zip->numFiles;
  17.         # ===— percorre os arquivos pegando os nomes e colocando em um array
  18.         for($i=0; $i<=($num_files)-1;$i++){
  19.             $saida[] = $zip->getNameIndex($i);
  20.         }
  21.         # ====— fecha a conexão
  22.         $zip->close();
  23.         # ====— Retora o array para ser manipulado
  24.         return $saida;
  25.     }
  26.     return false;
  27. }
  28. ?>

A função acima abre o ZIP e retorna um array com o conteúdo do arquivo. Útil pois não necessáriamente eu quero mostrar os arquivos na tela, mas posso utilizar para fazer qualquer outra coisa… desta forma eu apenas manipulo o array que foi retornado.

Para descompactar o arquivo ZIP eu utilizei esta função:

  1. <?
  2. /**
  3.  * Esta função descompacta arquivos
  4.  * de um zip
  5.  *
  6.  * @param String $path: Local do arquivo .zip
  7.  * @param String $pathunzip: Pasta onde os arquivos devem ser descompactados
  8.  */
  9. function unZip($path, $pathunzip=‘.’){
  10.     # ===— Instancia a classe do Zip
  11.     $zip = new ZipArchive;
  12.     # ===— Tenta abrir o zip
  13.     if($zip->open($path)){
  14.         $return   = $zip->extractTo($pathunzip); // executa o unzip
  15.         $zip->close(); // fecha a coneção com o .zip
  16.     } else {
  17.         echo ‘O arquivo não pode ser aberto.’;
  18.     }
  19. }
  20. ?>

Como vocês podem ver, é tudo muito simples. Eu na verdade fiz uma classe para poder manipular os arquivos… Você pode utilizar estas funções de qualquer maneira ok? Para testar podemos rodar o seguinte script:

  1. <?
  2. /**
  3.  * Esta função retorna um array com
  4.  * os nomes dos arquivos que estão
  5.  * dentro do zip.
  6.  *
  7.  * @param String $path: Local do arquivo .zip
  8.  * @return array ou false no caso de erro
  9.  */
  10. function zipToArray($path){
  11.     # ===— Instancia a classe
  12.     $zip = new ZipArchive;
  13.     # ====– Tenta abrir o zip
  14.     if($zip->open($path)){
  15.         # ===— Recupera o numero de arquivos do zip
  16.         $num_files = $zip->numFiles;
  17.         # ===— percorre os arquivos pegando os nomes e colocando em um array
  18.         for($i=0; $i<=($num_files)-1;$i++){
  19.             $saida[] = $zip->getNameIndex($i);
  20.         }
  21.         # ====— fecha a conexão
  22.         $zip->close();
  23.         # ====— Retora o array para ser manipulado
  24.         return $saida;
  25.     }
  26.     return false;
  27. }
  28.  
  29. /**
  30.  * Esta função descompacta arquivos
  31.  * de um zip
  32.  *
  33.  * @param String $path: Local do arquivo .zip
  34.  * @param String $pathunzip: Pasta onde os arquivos devem ser descompactados
  35.  */
  36. function unZip($path, $pathunzip=‘.’){
  37.     # ===— Instancia a classe do Zip
  38.     $zip = new ZipArchive;
  39.     # ===— Tenta abrir o zip
  40.     if($zip->open($path)){
  41.         $return   = $zip->extractTo($pathunzip); // executa o unzip
  42.         $zip->close(); // fecha a coneção com o .zip
  43.     } else {
  44.         echo ‘O arquivo não pode ser aberto.’;
  45.     }
  46. }
  47. print_r(zipToArray(‘zip.zip’)); // imprime o array com o conteudo do zip
  48. unZip(‘zip.zip’); // extrai o conteudo
  49. ?>

Claro que você pode utilizar uma biblioteca que faz muito mais coisas com seus arquivos zipados, mas dependendo do tamanho da sua aplicação na minha opinião não compensa usar uma lib gigante e chata de aprender apenas para ler e descompactar arquivos… mas isso fica a critério de cada um. Acho importante ao menos aprender como fazer.

para mais informações: http://br2.php.net/zip

Espero ter ajudado!

  1. 12 Comentários to “Descompactar arquivos com PHP”

  2. Marcelo, excelente esse seu post. Acesso seu blog todas as semana para ver as novidades. Valeu!!!

    ReplyReply

    Por Bruno Roberto Gomes (2 comments) em 29/03/2009

  3. Olá, legal! era exatamente isso que estava precisando, pra descompactar arquivos no servidor!

    ReplyReply

    Por Cleyton (1 comments) em 20/11/2009

  4. Que ótimo Cleyton!!!

    fico feliz em ter ajudado hehehehe

    abraços

    ReplyReply

    Por Marcelo Sabadini (109 comments) em 23/11/2009

  5. Cara, parabéns, salvou o dia, ótimo post!

    ReplyReply

    Por Eduardo (3 comments) em 01/12/2009

  6. @Eduardo: Fico muito feliz!

    Pretendo voltar a postar mais, o problema sempre é o tempo!

    um grande abraço!

    ReplyReply

    Por Marcelo Sabadini (109 comments) em 01/12/2009

  7. Boa tarde Marcelo, simples e objetivo o seu post! Se não for pedir muito, seria possível você postar além de Descompactar, como também adicionar os arquivos que estão no .ZIP no Banco de Dados? abraços

    ReplyReply

    Por Vinicius Oliveira (1 comments) em 01/02/2010

  8. @Vinicius Oliveira: fala kra tudo bom?

    mostrar como que coloca os arquivo no banco de dados foge um pouco do foco do post, pois isto pode ser feito de diversas formas.

    Mas de uma olhada no link abaixo, acho que vai conseguir fazer tranquilamente ok?

    http://marcelosabadini.com.br/blog/2008/10/30/mini-curso-de-php-parte-11-iv-insert-e-select-%E2%80%93-mysql-no-php/

    Um grande abraço!

    ReplyReply

    Por Marcelo Sabadini (109 comments) em 02/02/2010

  9. Não funcionou comigo, esta apresentando os seguintes erros quando eu executo o script:

    Warning: ZipArchive::close() [function.ZipArchive-close]: Invalid or unitialized Zip object in C:\… on line 28

    nessa linha esta o comando $zip->close();

    Warning: ZipArchive::extractTo() [function.ZipArchive-extractTo]: Invalid or unitialized Zip object in C:\… on line 52

    nessa linha esta o comando $return = $zip->extractTo($pathunzip); // executa o unzip

    Warning: ZipArchive::close() [function.ZipArchive-close]: Invalid or unitialized Zip object in C:\.. on line 53

    nessa linha esta o comando $zip->close(); // fecha a coneção com o .zip

    O que pode estar acontecendo?

    ReplyReply

    Por Diogo (1 comments) em 31/05/2010

  10. Kara, vlw mesmo. tava procurando um script assim. agora fiz uma adm completa.

    Grato mesmo

    ReplyReply

    Por James Bond (1 comments) em 21/10/2010

  11. Excelente sua funcao, tudo que procurava, parabéns e sucessos amigo

    ReplyReply

    Por Deivid R. Nogueira (1 comments) em 09/11/2010

  12. É possível usar esta classe com arquivos zipados com senha?

    Onde eu colocaria a senha no script?

    ReplyReply

    Por Anderson (2 comments) em 22/12/2010

  1. 1 Trackback(s)

  2. 11/02/2010: Marcelo Sabadini » Compactar arquivos com PHP

Coloque um Comentário

Links de comentários deveriam estar livres de nofollow.

Get Adobe Flash playerPlugin by wpburn.com wordpress themes