Compactando Arquivos em PHP e Forçando o Download
Com a linguagem de programação PHP, você pode manipular arquivos de várias maneiras. Uma dessas maneiras é compactar múltiplos arquivos em um arquivo ZIP e depois oferecer isso para download. Isso pode ser útil em várias situações, por exemplo, quando você quer permitir que os usuários baixem uma coleção de documentos em um único clique.
O exemplo de código PHP abaixo mostra como isso pode ser feito:
$directory = 'nomedapasta/nomedasubpasta; //diretorio para compactar
$zipfile = 'nome_da_pasta_aonde_vai_ficar_o_arquivo/'.$arquivoNome; // nome do zip gerado
$filenames = array();
function browse($dir) {
global $filenames;
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != ".." && is_file($dir.'/'.$file)) {
$filenames[] = $dir.'/'.$file;
}
else if ($file != "." && $file != ".." && is_dir($dir.'/'.$file)) {
browse($dir.'/'.$file);
}
}
closedir($handle);
}
return $filenames;
}
browse($directory);
// cria zip, adiciona arquivos...
$zip = new ZipArchive();
if ($zip->open($zipfile, ZIPARCHIVE::CREATE)!==TRUE) {
exit("Não pode abrir: <$zipfile>\n");
}
foreach ($filenames as $filename) {
$file = $filename;
$arquivo = substr($file, -3);
if($arquivo=="pdf"){
echo "Arquivo adicionado: <b>" . $filename . "<br/></b>";
$zip->addFile($filename,$filename);
}
}
//echo "Total de arquivos: <b>" . $zip->numFiles . "</b>\n";
//echo "Status:" . $zip->status . "\n";
$zip->close();
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename($arquivoNome));
header("Content-Length: ".filesize('nome_da_pasta_aonde_vai_ficar_o_arquivo/'.$arquivoNome));
ob_clean();
flush();
readfile('nome_da_pasta_aonde_vai_ficar_o_arquivo/'.$arquivoNome);
Primeiro, o script percorre um diretório especificado e armazena todos os nomes de arquivo em um array. Depois, ele cria um novo arquivo ZIP, abre-o e adiciona todos os arquivos do diretório a este ZIP. Por fim, ele fecha o arquivo ZIP e força um download.
Por padrão, este script adiciona apenas arquivos .pdf ao arquivo ZIP. Se você quiser incluir todos os tipos de arquivo, simplesmente remova a condição que verifica a extensão do arquivo.
Lembre-se de que, ao forçar um download usando headers HTTP, é importante chamar as funções ob_clean() e flush(). A função ob_clean() limpa qualquer saída do buffer que possa interferir nos headers HTTP, e a função flush() envia o arquivo ZIP para o cliente. Depois, a função readfile() é usada para ler o arquivo e enviar o conteúdo para o cliente.
Assim, com algumas linhas de PHP, você pode criar um poderoso script de download que compacta e oferece múltiplos arquivos para download ao usuário.