mzaidan 2 Denunciar post Postado Março 17, 2012 Boa tarde. Possuo uma página onde carrego, automaticamente, todos os arquivos .pdf que existem dentro de uma pasta. Gostaria de ter um link, onde eu clicasse, e todos esses arquivos fossem zipados e já abrisse para download pro cliente. Tem como? Grato Alguém? Por favor Tentei assim: <?php $directory = 'http://www.meusite.com.br/teste/pasta'; //diretorio para compactar $zipfile = 'backup.zip'; // nome do zip gerado echo $directory; $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) { 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(); ?> Mas deu erro. Eu queria zipar um diretório e já fazer o download do arquivo zipado. Tem como? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Março 17, 2012 Antes de mais nada: http://www.meusite.com.br/teste/pasta Você deve passar o caminho relativo, por exemplo, se o script que vai gerar zip estiver na raiz do site, você deve informar: /teste/pasta Compartilhar este post Link para o post Compartilhar em outros sites
mzaidan 2 Denunciar post Postado Março 17, 2012 Consegui com esse código: <?php $directory = 'afo'; //diretorio para compactar $zipfile = 'backup.zip'; // 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(); É criado um arquivo com o nome backup.zip com os arquivos. Pronto, meio caminho andado. Só preciso que, assim que a pessoa executar essa página, crie o arquivo .zip e já abra para ela fazer o download do arquivo recém criado. Após isso, gostaria de deletar o arquivo do servidor. Alguma luz? Desde já agradeço. Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Março 17, 2012 Basta usar o header, primeiro exemplo. Compartilhar este post Link para o post Compartilhar em outros sites
mzaidan 2 Denunciar post Postado Março 17, 2012 Eu tentei assim: <?php $directory = 'afo'; //diretorio para compactar $zipfile = 'afo/backup.zip'; // 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(); // Enviando para o cliente fazer download header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="backup.zip"'); readfile('backup.zip'); exit(0); ?> Mas deu erro no header. O que eu poderia fazer? E outra, estava pensado aqui: Se duas pessoas tentarem isso ao mesmo tempo, daria erro, não é verdade? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Março 17, 2012 Eu tentei assim: <?php $directory = 'afo'; //diretorio para compactar $zipfile = 'afo/backup.zip'; // 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(); // Enviando para o cliente fazer download header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="backup.zip"'); readfile('backup.zip'); exit(0); ?> Mas deu erro no header. O que eu poderia fazer? E outra, estava pensado aqui: Se duas pessoas tentarem isso ao mesmo tempo, daria erro, não é verdade? A primeira coisa a fazer é pensar, se você está salvando o arquivo em: afo/backup.zip Como espera que isto funcione? readfile('backup.zip'); Você tem que especificar o caminho completo até o zip. Outra coisa, não pode haver nenhuma saida para o navegador antes, isto por causa do header. Compartilhar este post Link para o post Compartilhar em outros sites
mzaidan 2 Denunciar post Postado Março 18, 2012 Consegui. Mas tem um pequeno problema: Eu estou zipando os arquivos de um diretório. Ai ta tudo normal. Mas, no zip, fica assim: arquivo.zip - Quando eu descompacto, mostra todas as pastas do caminho. Por exemplo: pasta1 - pasta2 - arquivo.zip. Ou seja, quando o arquivo é descompactado, aparecem todas as pastas. Gostaria que zipasse em uma única pasta, independente de quantas existirem. Tem como? Grato Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Março 18, 2012 Tem, mova todos os arquivos de todas as pastas para uma só e use ela para zipar. Compartilhar este post Link para o post Compartilhar em outros sites