Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mzaidan

Zipar arquivos e fazer download

Recommended Posts

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.