Criando arquivos ZIP no PHP com a ZIPlib 

Escrito por Daniel Nogueira • Nov 4th, 2007 • Categoria: PHP, Programação

A linguagem PHP nos oferece nativamente a criação de arquivos ZIP a partir da versão 5.2.0, mas quem usa uma das versões anteriores não precisa recorrer a uma dll para fazer este trabalho, existem várias classes que executam perfeitamente esta função. Uma delas é a ZIPlib, uma ótima classe para quem precisa criar arquivos zip no PHP.

A ZIPlib é uma classe opensource, desenvolvida para comprimir arquivos ou pastas contidas no servidor, em formato zip.

Download da classe

Para efetuar o download desta classe acesse este link:
http://www.phpclasses.org/browse/package/1033.html.

Exemplo

Neste exemplo você pode executar duas funções, a primeira é fazer o upload de um arquivo, e executar o download do mesmo no formato zip. E a segunda opção é digitar o caminho de uma pasta no servidor, e fazer o download do conteúdo da mesma, compactado no formato zip.

Interface

Crie este html que será usado para esta duas funções, salve o arquivo como index.html:

<html>
<body>
<strong>Comprir um arquivo</strong>
<form method=”post” action=”zipfile.php” enctype=”multipart/form-data”>
<label>
Selecione o arquivo no cliente a ser zipado: </label>
<div align=”left”>
<input name=”arquivo” type=”file” id=”diretorio” size=”40″ />
<input type=”submit” value=”Zip”>
</div>
</form>
</div>
<p><strong>Comprimir um diretório</strong></p>
<form method=”post” action=”zipdir.php” enctype=”multipart/form-data”>
<label>Digite o caminho do diretório dentro no servidor <br>
a ser zipado
( Ex: ./ ): </label>
<div align=”left”>
<label>
<input name=”diretorio” type=”text” size=”52″>
</label>
<input name=”submit” type=”submit” value=”Zip”>
</div>
</form>
</div>
</body>
</html>

Nesta página contem dois forms, o primeiro para o usuário poder selecionar o arquivo para upload, comprimi-lo, e efetuar o download do mesmo comprimido no formato zip. No action do form esta à chamada para o arquivo php que executara esta função.

<form method=”post” action=”zipfile.php” enctype=”multipart/form-data”>
<label>
Selecione o arquivo no cliente a ser zipado: </label>
<div align=”left”>
<input name=”arquivo” type=”file” id=”diretorio” size=”40″ />
<input type=”submit” value=”Zip”>
</div>
</form>

No outro form o usuário poderá digitar o caminho de um diretório no servidor, e comprimir todo o seu conteúdo num arquivo zip. No action do form esta à chamada para o arquivo php que executara esta função. E após comprimir os arquivos, disponibiliza para download o arquivo zipado.

<form method=”post” action=”zipdir.php” enctype=”multipart/form-data”>
<label>Digite o caminho do diretório dentro no servidor <br>
a ser zipado
( Ex: ./ ): </label>
<div align=”left”>
<label>
<input name=”diretorio” type=”text” size=”52″>
</label>
<input name=”submit” type=”submit” value=”Zip”>
</div>
</form>

Comprimir somente um arquivo

A primeira função consiste em executar o upload de um arquivo e disponibilizar o download do arquivo no formato zip.

Crie um arquivo php com este código abaixo, e salve o arquivo como zipfile.php:

<?php

//Verifica se o diretório existe
if(!file_exists(”upload/”)){

mkdir(”upload/”);

}

//Monta o array com o arquivo a ser zipado
$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;

//Verifica se foi preenchido o arquivo
if($arquivo['name'] != “”)
{

//Move o arquivo para a pasta de upload
move_uploaded_file($arquivo['tmp_name'], “./upload/” . $arquivo['name']);

//Inicia o buffer de saída
ob_start();

//Carrega a library
require(’./zip.lib.php’);

//Cria um novo objeto zip
$zipfile = new zipfile(’arquivo.zip’,’./’,”);

//* Entra na pasta upload
chdir(’upload’);

//Adiciona o arquivo
$zipfile->addFileAndRead($arquivo['name']);

//Executa o dowload
echo $zipfile->file();

}

?>

No primeiro bloco do arquivo, é verificado se a pasta para upload do arquivo está criada, se não estiver, cria.

//Verifica se o diretório existe
if(!file_exists(”upload/”)){

mkdir(”upload/”);

}

No segundo bloco do arquivo, é criado o array contendo os dados do arquivo, que foi executado o upload. E no if a baixo, verifica se foi setado algum arquivo.

//Cria o array com o arquivo a ser zipado
$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;

//Verifica se foi preenchido o arquivo

if($arquivo['name'] != “”)

No próximo bloco, movemos o arquivo do diretório temporário, para o diretório de upload. E iniciamos o buffer para criar o arquivo zip.

//Move o arquivo para a pasta de upload
move_uploaded_file($arquivo['tmp_name'], “./upload/” . $arquivo['name']);

//Inicia o buffer de saida
ob_start();

No quarto bloco, inserimos a classe ZIPlib no arquivo, criamos um novo objeto zip contendo o nome do arquivo de saída em formato zip. E entramos no diretório upload.

//Carrega a library
require(’./zip.lib.php’);

//Cria um novo objeto zip
$zipfile = new zipfile(’arquivo.zip’,”,”);

//* Entra na pasta upload
chdir(’upload’);

No ultimo bloco, inserimos no arquivo comprimido, o arquivo que foi executado o upload. E disponibilizamos para download o mesmo.

//Adiciona o arquivo
$zipfile->addFileAndRead($arquivo['name']);

//Chama o download do arquivo
echo $zipfile->file();

Comprimir um diretório

Para comprimir um diretório o código não muda muito, comparado a função anterior. Para isto em vez de usarmos a função addFileAndRead, usaremos addDirContent, que insere todo o conteúdo do diretório que foi passado pelo parâmetro. Como mostra o exemplo a seguir.

Crie um arquivo php com este código abaixo, e salve o arquivo como zipdir.php:

<?php

//Verifica se foi preenchido o diretório
if($diretorio != “”)
{

//Inicia o buffer de saída
ob_start();

//Carrega a library
require(’./zip.lib.php’);

//Cria um novo objeto zip
$zipfile = new zipfile(’diretorio.zip’,”,”);

//* Entra no diretorio escolhido
chdir($diretorio);

//Adiciona o diretório
$zipfile->addDirContent(’./’);

//Executa o dowload
echo $zipfile->file();

}

?>

Como falado anteriormente o código não muda muito, no primeiro bloco, verificamos se foi digitado o caminho do diretório a ser zipado. Após iniciamos o buffer para criar o arquivo zip, e inserimos a classe ZIPlib no arquivo.

//Verifica se foi preenchido o diretório
if($diretorio != “”)
{

//Inicia o buffer de saída
ob_start();

//Carrega a library
require(’./zip.lib.php’);

No ultimo bloco, criamos um novo objeto zip contendo o nome do arquivo de saída em formato zip. E entramos no diretório upload, inserimos todo o conteúdo do diretório no arquivo compactado. E disponibilizamos para download o mesmo.

//Cria um novo objeto zip
$zipfile = new zipfile(’diretorio.zip’,”,”);

//* Entra no diretorio escolhido
chdir($diretorio);

//Adiciona o diretório
$zipfile->addDirContent(’./’);

//Chama o download do arquivo
echo $zipfile->file();

Ta tudo pronto!

Então agora é só testar, selecione um arquivo para upload e execute o download do mesmo comprimido no formato zip. Só um lembrete, não tente fazer upload de arquivos com tamanhos superiores ao que está definido na configuração do Php.

Agora digite um caminho de um diretório que esteja no servidor, e execute o download de todo o seu conteúdo comprimido num arquivo zipado.

Download do Exemplo

O download do exemplo você encontrara no link:
http://www.fdweb.com.br/downloads/phpziplib.rar

Confira ofertas de: DVD, filmes, celular, notebook, livros, jogos, Wii, PS3, MP4

12 comentários »

  1. Show de bola. Parabens!!

  2. Daniel, parabens, encontrei um link para seu arquivo no PHPClasses.org

    Muito bom mesmo

    Dyego Fernandes de Sousa

    [conteúdo editado]
    Veja meu currículo:

  3. funciona legal parabéms mas como uso com subpastas tem jeito???

    Abraços

    Marcel

  4. É possivel apenas comprimir os arquivos encontrados no diretorio, e não pastas.

  5. Olá…ok…funcionou…só que tem um detalhe
    o PHP limita o tamanho dos arquivos em 2MB, e eu quero compacta uam pasta q tm em médias 154 MB.
    Teria algum modo de compactá-las aos poucos ou algo assim??

    Alguém poderia me ajudar???

    Obrigado….

  6. ah…meu e-mail:
    karine@pecell.com.br

  7. No arquivo php.ini procure pela chave “upload_max_filesize” nela tu define o tamanho maximo do arquivo que vai ser feito o upload.

  8. Daniel,

    Preciso gerar um arquivo zip protegido por senha. Existe alguma forma de fazê-lo usando PHP?

  9. Adorei a Classe, muito boa e o q a muito procurava….

    Porém ñ consigo zipar outro diretorio q seja fora do diretório corrente

    Ex.: ” ./pasta/ ”

    Ajuda!!!!!!!!!!

  10. Olá
    O artigo esta otimo mas não consegui fazer funcionar o zip.dir.. não consigo zipar o diretorio pode me explicar como passo o parametro corretamente ?

  11. Olá meu problema eu resolvi.. hehe agora se alguem souber como fazer isso do pc para o servidor… me da um toque hehe

  12. Olá Daniel,
    não teria possibilidade de zipar uma pasta completa com existência de sub-pastas?

    Caso tenha feito ou encontrado em algum site, poderia passar pra mim?

    Muito obrigada!

    Sucesso. ;)

Deixe um comentário