Compactar arquivos e fazer download com PHP

Compactar arquivos e fazer download com PHP

Neste artigo vamos ver como é possível fazer download de arquivos com PHP. Também vamos ver como é possível compactar arquivos com PHP.

Para fazer download de um arquivo precisamos alterar os headers da requisição. O mínimo necessário para fazer o download de um arquivo é adicionar 3 headers na nossa requisição, que seriam os seguintes:

 

Content-Description: Para informar o tipo de operação que vamos fazer

Content-Type: Informe o tipo de retorno da requisição, que será application/octet-stream

Content-Disposition: Aqui informar que vamos anexar (attach) um arquivo e informamos o caminho para acessar o arquivo.

 

Nosso código ficará da seguinte forma:

 

$arquivo = "meu_arquivo.pdf";

header("Content-Description: File Transfer"); 

header("Content-Type: application/octet-stream"); 

header("Content-Disposition: attachment; filename=\"". basename($arquivo) ."\""); 

readfile ($arquivo);

exit(); 

 

No exemplo anterior, estamos fazendo o download de um arquivo chamado "meu_arquivo.pdf" que está localizado na mesma pasta onde está sendo executado este script. Perceba que ao informar o nome do arquivo no header Content-Disposition utilizamos a função basename(), ela retorna o caminho para o arquivo. A função readfile() faz a leitura do arquivo e escreve o resultado da leitura direto no buffer. Seu retorno é o número de bytes do arquivo.

Uma outra forma de fazer download de um arquivo seria a seguinte:

 

$arquivo = "meu_arquivo.pdf";

header('Content-Description: File Transfer');

header('Content-Type: application/octet-stream');

header("Content-Disposition: attachment; filename=\"". basename($arquivo) ."\""); 

header('Expires: 0');

header('Cache-Control: must-revalidate');

header('Content-Length: ' . filesize($arquivo));

readfile($arquivo);

exit()

 

Perceba que no exemplo anterior adicionamos novos headers a nossa requisição, que foram os seguintes:

 

Expires: Uma data futura onde o cache deve expirar. Quando você informa zero, quer dizer que o conteúdo não expira.

Cache-Control: Informa ao navegador a forma de cachear o conteúdo.

Content-Length: O tamanho do arquivo em bytes. Para obter o tamanho em bytes utilizamos a função filesize()

 

Agora vamos ver como é possível compactar arquivos com PHP

O PHP possui uma extensão chamada ZipArchive que permite compactar e descompactar arquivos. 

Sua utilização é bem simples.

 

$arquivozip = "arquivo_compactado.zip";

$arquivo = "meu_arquivo.pdf";

$zip = new ZipArchive;

$zip->open($arquivozip, ZipArchive::CREATE);

$zip->addFile($arquivo, basename($arquivo));

$zip->close();

header('Content-Type: application/zip');

header("Content-Disposition: attachment; filename=\"". basename($arquivozip) ."\""); 

header('Content-Length: ' . filesize($arquivozip));

readfile($arquivozip);

unlink($arquivozip);

exit();

 

No código acima criamos uma instância de um novo arquivo zip utilizando o comando new ZipArchive. A seguir, criamos um arquivo em branco utilizando o método open, informando o nome do arquivo e a operação, que em nosso caso é criar. Na sequência, utilizamos o método add() para adicionar o arquivo, o método recebe dois parâmetros, o primeiro é o nome do arquivo e o segundo é o seu caminho. Aopis terminar de adicionar os arquivos que vão ser compactados, utilizamos o método close() para concluir a criação do arquivo compactado.

A forma de fazer o download não mudou, mas temos um comando novo no final, o unlink(). Ao criar o arquivo compactado ele está sendo criado em disco. Este comando serve para apagar o arquivo depois que ele foi enviado para o usuário.

Para concluir, você deve querer saber como fazer para pegar uma pasta ou um conjunto de arquivo e fazer a compactação e o download. 

Para listar arquivos podemos usar a função glob. Ela retorna um array contendo o caminho dos arquivos dentro da pasta informada. Com o array em mãos, podemos fazer um foreach em seu conteúdo para iterar cada arquivo e adicionar no arquivo zip. Nosso código anterior ficará da seguinte forma:

 

$arquivozip = "arquivo_compactado.zip";

$pasta = "nome_da_pasta";

$zip = new ZipArchive;

$zip->open($arquivozip, ZipArchive::CREATE);

$arquivos = glob($pasta . "/*");

foreach($arquivos as $arquivo){

$nome_arquivo = str_replace($pasta. "/*","", $arquivo);

$zip->addFile($nome_arquivo, basename($arquivo));

}

$zip->close();

header('Content-Type: application/zip');

header("Content-Disposition: attachment; filename=\"". basename($arquivozip) ."\""); 

header('Content-Length: ' . filesize($arquivozip));

readfile($arquivozip);

unlink($arquivozip);

exit();

 

Encerramento

 

Neste arquivo você viu como fazer download e compactar arquivos com PHP.

Se você achou este assunto interessante, com certeza deve querer saber mais sobre como listar arquivos com PHP. Recomendo a leitura do artigo a seguir

 

Listando arquivos com PHP

 

Outros conteudos que podem ser de seu interesse

Localizando e substituindo dados com expressões regulares com PHP
14/06/2020PHP

Localizando e substituindo dados com expressões regulares com PHP

Veja alguns exemplos de como localizar ou atualizar dados com expressões regulares com PHP

Saiba mais...
Criar PDF com PHP
22/11/2020PHP

Criar PDF com PHP

Um exemplo de como criar um PDF de forma fácil usando PHP

Saiba mais...

Conteúdo sobre banco de dados sem complicação!