Atualizado em 31 de Julho de 2013

Compactar Pastas e Arquivos com PHP

Olá pessoal,

O post de hoje e sobre uma dica muito legal e útil para todos os programadores PHP, neste post vamos ver como compactar pastas ou arquivos com PHP. Para fazer a compactação da pasta ou arquivos vamos usar a classe ZipArchive que é uma classe nativa do próprio PHP.

Esta mesma classe nos permite compactar e descompactar arquivos. Para utilizar esta classe e bem simples, vamos ver um exemplo:

<?php
$diretorio = getcwd().'/pasta_teste/';

// Instancia a Classe Zip
$zip = new ZipArchive();
  // Cria o Arquivo Zip, caso não consiga exibe mensagem de erro e finaliza script
  if($zip->open('nome_arquivo_zip.zip', ZIPARCHIVE::CREATE) == TRUE)
  {
   // Insere os arquivos que devem conter no arquivo zip
   $zip->addFile($diretorio.'arquivo1.txt','arquivo1.txt');
   $zip->addFile($diretorio.'arquivo2.txt','arquivo2.txt');

   echo 'Arquivo criado com sucesso.';
  }
  else
  {
   exit('O Arquivo não pode ser criado.');
  }

  // Fecha arquivo Zip aberto
  $zip->close();
?>

Observa as linhas 10 e 11, é através deste comando que inserimos os arquivos que devem conter no arquivo zip que vai ser criado.

Caso deseje zipar a pasta toda basta ajustar o código usando a dica do post listar arquivos do diretório.


Dúvidas??? Comentem!!!


"Esta dica te ajudou de alguma forma?" Então ajude outras pessoas compartilhando este conteúdo com seus amigos! =)


Até a próxima.

Tags:  Comandos PHP | Funções | PHP

Comentários

Sua foto do perfil

Wellington Gallo

Olá, fiz o codigo para ele gerar o zip de varios arquivos mais vem com o seguinte erro: Warning: ZipArchive::close(): Read error: Bad file descriptor in C:\xampp\htdocs\zip\zip.php on line 28


Segue o codigo:

$pasta = "teste/";

$diretorio = dir($pasta);

// Instancia a Classe Zip
if($zip1 = new ZipArchive()){

// Cria o Arquivo Zip, caso não consiga exibe mensagem de erro e finaliza script
if($zip1->open('arquivo_zip.zip', ZIPARCHIVE::CREATE) == TRUE){

while($arquivo = $diretorio->read()){

// Insere os arquivos que devem conter no arquivo zip
$zip1->addFile($pasta.$arquivo);

}

echo "Arquivo criado com sucesso.";
$diretorio->close();
}

}else{
die("O Arquivo não pode ser criado");
}

$zip1->close();

22 de Fevereiro de 2016 - 16:58

Sua foto do perfil

Mauricio Programador

Olá Wellington,

Você tem que cuidar ao usar o comando "$diretorio->read()" ele retorna não so os arquivos mais retorna estrutura de pastas, o que o comando ZIP não consegue ler.

Coloque na função somente os arquivos que você deseja zipar.

Abraço.

14 de Março de 2016 - 15:02

Sua foto do perfil

Bruno Mangini Alves

Obrigado Mauricio!
Me ajudou bastante!!

20 de Agosto de 2014 - 15:16

Sua foto do perfil

Felipe

Olá,
Estou com um problma ao adicionar o arquivo... Meu arquivo fica em outro diretório e preciso criar o zip em diretório diferente...

Usei or die("Erro ao adicionar arquivo...") no addFile e sempre está dando errada a inserção.. Alguma dica?

14 de Maio de 2014 - 17:32

Sua foto do perfil

Mauricio Programador

Olá Felipe,

verificou se o caminho esta correto, pois não há a necessidade de estarem no mesmo diretório.

Abraço.

15 de Maio de 2014 - 11:10

Sua foto do perfil

LUAN SIDNEY NASCIMENTO DOS SANTOS

"! \\192.168.10.12\matheusat\Rascunhos\teste_comp\nome_arquivo_zip.zip: Falha de CRC em arquivo1.txt. O arquivo está corrompido
! \\192.168.10.12\matheusat\Rascunhos\teste_comp\nome_arquivo_zip.zip: Falha de CRC em arquivo2.txt. O arquivo está corrompido
"
Oi cara boa tarde, o aqruivo estar sendo criando sem problemas, aliasi obrigado pela ajuda,porem quando tento descompactar usando o winrar ele mostrar a mensagem acima, vc poderia me dar uma luz de ante mão obrigado pela atenção.

20 de Janeiro de 2014 - 17:24

Sua foto do perfil

Mauricio Programador

Olá Luan,

testei o código aqui e descompactei pelo winrar para verificar e aqui funcionou corretamente.
Este arquivo já não estava com problemas antes? Tenta criar um outro arquivo com outros nomes para ver.


Abraço.

20 de Janeiro de 2014 - 17:43

Sua foto do perfil

LUAN SIDNEY NASCIMENTO DOS SANTOS

Irmão, desculpe estar lhe importunando mais uma vez rsrsrs é que após inumeros teste chegeui a conclusão q o pro estar no conteudo fis testes com varios arquivos diferentes onde mudavam apenas o conteudo que regras ele segue como posso saber onde espeficicamente estar o erro

21 de Janeiro de 2014 - 10:39

Sua foto do perfil

Mauricio Programador

Olá amigo,

não tem problema. Olha não sei se pode estar no conteúdo pois esta biblioteca usa os mesmos métodos de compressão do ZIP normal. Se quiser me manda um arquivo de exemplo que testo aqui (contato@mauricioprogramador.com.br).


Abraço.

21 de Janeiro de 2014 - 10:39

Sua foto do perfil

LUAN SIDNEY NASCIMENTO DOS SANTOS

Cara os arquivos estão OK, mas tem como ser alguma coisa relacionada a permissão ou coisa assim , a barra do camainho tem que ser qual \ ou / ??

21 de Janeiro de 2014 - 10:43

Sua foto do perfil

Mauricio Programador

Permissão pode ser, mais o erro seria outro. a barra é /.

Abraço.

21 de Janeiro de 2014 - 10:45

Sua foto do perfil

LUAN SIDNEY NASCIMENTO DOS SANTOS

<?php

$diretorio = getcwd()."/";

// Instancia a Classe Zip
$zip = new ZipArchive();
// Cria o Arquivo Zip, caso não consiga exibe mensagem de erro e finaliza script
if($zip->open('nome_arquivo_zip.zip', ZIPARCHIVE::CREATE) == TRUE){
// Insere os arquivos que devem conter no arquivo zip
$diretorio = str_replace("\\","/",$diretorio);
print "D:/teste/arquivo1.txt
";

//$zip->addFile($diretorio.'arquivo1.txt','arquivo1.txt') or die("Erro ao adicionar o arquivo");
//$zip->addFile($diretorio.'arquivo2.txt','arquivo2.txt') or die("Erro ao adicionar o arquivo");
$qrrr = "dkfk kjk jk jk jkjkjkjkjkj kjkj kj j kj k jk kj kjkj k kk kjjjkjjk jjk jkjkjkjkjkjkjkjkjkjjkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllllllllllllllllllllllllllllllllllllllll";

$zip->addFromString("testfilephp2.txt", "luan");
$zip->addFromString("testfilephp3.txt", "luan sidney nascimento dos santos");
$zip->addFromString("testfilephp4.txt", $qrrr);

echo 'Arquivo criado com sucesso.';
}
else{
exit('O Arquivo não pode ser criado.');
}
// Fecha arquivo Zip aberto
$zip->close();
?>


Esse é um bom exemplo, os dois primeiros arquivos são descompactados mas o terceito ,testfilephp4.txt, não ele diz que deu erro de CRC, foi assim que chegeui a conclução de que talvez fosse o conteudo de alguam maneira.

obrigado pela atenção, aguardo retorno

21 de Janeiro de 2014 - 11:26

Sua foto do perfil

Mauricio Programador

Olá Luan,

teste ai aqui seu código fiz algumas mudanças nada de mais e ta funcionando normal, da uma olhada:

<?php
$diretorio = getcwd()."/";

// Instancia a Classe Zip
$zip = new ZipArchive();

// Cria o Arquivo Zip, caso não consiga exibe mensagem de erro e finaliza script
if($zip->open('nome_arquivo_zip.zip', ZIPARCHIVE::CREATE) == TRUE)
{
$qrrr = "dkfk kjk jk jk jkjkjkjkjkj kjkj kj j kj k jk kj kjkj k kk kjjjkjjk jjk jkjkjkjkjkjkjkjkjkjjkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllllllllllllllllllllllllllllllllllllllll";

$zip->addFromString("testfilephp2.txt", "luan");
$zip->addFromString("testfilephp3.txt", "luan sidney nascimento dos santos");
$zip->addFromString("testfilephp4.txt", $qrrr);

echo 'Arquivo criado com sucesso.';
}
else
{
exit('O Arquivo não pode ser criado.');
}

// Fecha arquivo Zip aberto
$zip->close();
?>


Abraço.

21 de Janeiro de 2014 - 11:26

Sua foto do perfil

LUAN SIDNEY NASCIMENTO DOS SANTOS

Mas vc tentou descompactar o aqruivo criado usando o winrar, pq é nessa hora o pro, ele até cria, mas ñ deixa descompactar quer dizer ele ate deixa ele decompactar os dois primeiro e na hora do ultimo da um erro falando q o arquivo estar corrompido.
Se vc tiver descompactado e funcionando o pro deve ser na minha maquina alguma permissão ou a dll corrompida rsrsrsrs

obrigado pela atenção

21 de Janeiro de 2014 - 14:26

Sua foto do perfil

Mauricio Programador

Sim aqui na minha maquina eu tenho o winrar instalado e fiz o precedimento com ele.

realmente deve ser algo na maquina, se você tiver como testar em outra seria bom.


Abraço.

21 de Janeiro de 2014 - 14:27

Sua foto do perfil

Anderson Krueger

Ótimo post, mas em meu teste apresentou o seguinte erro: Class 'ZipArchive' not found in (ou seja ela é inexistente) gostaria de saber de qual versão do php ela é nativa ,
Agradeço desde já,
Anderson Krueger.

30 de Novembro de 2013 - 12:09

Sua foto do perfil

Mauricio Programador

Olá Anderson,

a partir da versão PHP 5.2.0 ou superior esta biblioteca já vem nativa.

Grande Abraço.

30 de Novembro de 2013 - 14:44

Sua foto do perfil

Anderson Krueger

Muito obrigado mesmo, pela resposta e pela rapidez com a qual a respondeu.

30 de Novembro de 2013 - 18:05

Sua foto do perfil

Mauricio Programador

Que isso amigo, qualquer coisa post aí.

grande abraço.

30 de Novembro de 2013 - 18:06

NEWSLETTER

Receba dicas de programação
em seu e-mail

TWITTER

Acompanhe tudo o que rola
com Mauricio Programador

NEWSLETTER