Compactar arquivos e fazer download com PHP
Confira como 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