teste

quinta-feira, 15 de setembro de 2016

PHP - Zipar todos os arquivos de uma pasta e forçar download.

 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:

$arquivoNome = 'arquivo.zip';

$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.