Ir para conteúdo

POWERED BY:

Arquivado

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

Andre Summers

Zipar e fazer Download

Recommended Posts

Bom dia, Pessoal. Preciso de vossa ajuda.

 

To montando um script que busca o path (caminho dos arquivos no servidor) dos arquivos marcados nos checkboxes de um formulário.

 

Eu quero fazer com que esses arquivos selecionados sejam zipados e o usuario baixe o arquivo ZIP com todos eles para não ter que baixar um por um.

 

Tem como fazer isso? Podem me dar um Help?

 

Desde já agradeço pela atenção.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse Phar não seria só pra comprimir arquivos com extensão PHP não?

 

Não teriam outras opções não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu dei uma pesquisada e montei um script usando uma Classe que encontrei no http://www.phpclasses.org/. Pra quem quiser dar uma olhada e usar.

 

CreatZip.php

/**
 * Créditos devidamente mantidos.
 *
 * Class to dynamically create a ZIP FILE (archive)
 * Classe para criar dinamicamente um arquivo ZIP
 *
 * @author Rochak Chauhan
 */

class createZip  {  

	public $compressedData = array(); 
	public $centralDirectory = array(); // central directory   
	public $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
	public $oldOffset = 0;

	/**
	 * Function to create the directory where the file(s) will be unzipped
	 *
	 * @param $directoryName string 
	 *
	 */
	
	public function addDirectory($directoryName) {
		$directoryName = str_replace("\\", "/", $directoryName);  

		$feedArrayRow = "\x50\x4b\x03\x04";
		$feedArrayRow .= "\x0a\x00";	
		$feedArrayRow .= "\x00\x00";	
		$feedArrayRow .= "\x00\x00";	
		$feedArrayRow .= "\x00\x00\x00\x00"; 

		$feedArrayRow .= pack("V",0); 
		$feedArrayRow .= pack("V",0); 
		$feedArrayRow .= pack("V",0); 
		$feedArrayRow .= pack("v", strlen($directoryName) ); 
		$feedArrayRow .= pack("v", 0 ); 
		$feedArrayRow .= $directoryName;  

		$feedArrayRow .= pack("V",0); 
		$feedArrayRow .= pack("V",0); 
		$feedArrayRow .= pack("V",0); 

		$this -> compressedData[] = $feedArrayRow;
		
		$newOffset = strlen(implode("", $this->compressedData));

		$addCentralRecord = "\x50\x4b\x01\x02";
		$addCentralRecord .="\x00\x00";	
		$addCentralRecord .="\x0a\x00";	
		$addCentralRecord .="\x00\x00";	
		$addCentralRecord .="\x00\x00";	
		$addCentralRecord .="\x00\x00\x00\x00"; 
		$addCentralRecord .= pack("V",0); 
		$addCentralRecord .= pack("V",0); 
		$addCentralRecord .= pack("V",0); 
		$addCentralRecord .= pack("v", strlen($directoryName) ); 
		$addCentralRecord .= pack("v", 0 ); 
		$addCentralRecord .= pack("v", 0 ); 
		$addCentralRecord .= pack("v", 0 ); 
		$addCentralRecord .= pack("v", 0 ); 
		$ext = "\x00\x00\x10\x00";
		$ext = "\xff\xff\xff\xff";  
		$addCentralRecord .= pack("V", 16 ); 

		$addCentralRecord .= pack("V", $this -> oldOffset ); 
		$this -> oldOffset = $newOffset;

		$addCentralRecord .= $directoryName;  

		$this -> centralDirectory[] = $addCentralRecord;  
	}	 
	
	/**
	 * Function to add file(s) to the specified directory in the archive 
	 *
	 * @param $directoryName string 
	 *
	 */
	
	public function addFile($data, $directoryName)   {
 
		$directoryName = str_replace("\\", "/", $directoryName);  
	
		$feedArrayRow = "\x50\x4b\x03\x04";
		$feedArrayRow .= "\x14\x00";	
		$feedArrayRow .= "\x00\x00";	
		$feedArrayRow .= "\x08\x00";	
		$feedArrayRow .= "\x00\x00\x00\x00"; 

		$uncompressedLength = strlen($data);  
		$compression = crc32($data);  
		$gzCompressedData = gzcompress($data);  
		$gzCompressedData = substr( substr($gzCompressedData, 0, strlen($gzCompressedData) - 4), 2); 
		$compressedLength = strlen($gzCompressedData);  
		$feedArrayRow .= pack("V",$compression); 
		$feedArrayRow .= pack("V",$compressedLength); 
		$feedArrayRow .= pack("V",$uncompressedLength); 
		$feedArrayRow .= pack("v", strlen($directoryName) ); 
		$feedArrayRow .= pack("v", 0 ); 
		$feedArrayRow .= $directoryName;  

		$feedArrayRow .= $gzCompressedData;  

		$feedArrayRow .= pack("V",$compression); 
		$feedArrayRow .= pack("V",$compressedLength); 
		$feedArrayRow .= pack("V",$uncompressedLength); 

		$this -> compressedData[] = $feedArrayRow;

		$newOffset = strlen(implode("", $this->compressedData));

		$addCentralRecord = "\x50\x4b\x01\x02";
		$addCentralRecord .="\x00\x00";	
		$addCentralRecord .="\x14\x00";	
		$addCentralRecord .="\x00\x00";	
		$addCentralRecord .="\x08\x00";	
		$addCentralRecord .="\x00\x00\x00\x00"; 
		$addCentralRecord .= pack("V",$compression); 
		$addCentralRecord .= pack("V",$compressedLength); 
		$addCentralRecord .= pack("V",$uncompressedLength); 
		$addCentralRecord .= pack("v", strlen($directoryName) ); 
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("V", 32 ); 

		$addCentralRecord .= pack("V", $this -> oldOffset ); 
		$this -> oldOffset = $newOffset;

		$addCentralRecord .= $directoryName;  

		$this -> centralDirectory[] = $addCentralRecord;  
	}

	/**
	 * Fucntion to return the zip file
	 *
	 * @return zipfile (archive)
	 */

	public function getZippedfile() { 

		$data = implode("", $this -> compressedData);  
		$controlDirectory = implode("", $this -> centralDirectory);  

		return   
			$data.  
			$controlDirectory.  
			$this -> endOfCentralDirectory.  
			pack("v", sizeof($this -> centralDirectory)).	 
			pack("v", sizeof($this -> centralDirectory)).	 
			pack("V", strlen($controlDirectory)).			 
			pack("V", strlen($data)).				
			"\x00\x00";							 
	}

	/**
	 *
	 * Function to force the download of the archive as soon as it is created
	 *
	 * @param archiveName string - name of the created archive file
	 */

	public function forceDownload($archiveName) {
		$headerInfo = '';
		 
		if(ini_get('zlib.output_compression')) {
			ini_set('zlib.output_compression', 'Off');
		}

		// Security checks
		if( $archiveName == "" ) {
			echo "<html><title>Erro </title><body><BR><B>ERRO:</B> O arquivo não foi especificado.</body></html>";
			exit;
		} 
		elseif ( ! file_exists( $archiveName ) ) {
			echo "<html><title>Erro </title><body><BR><B>ERRO:</B> Arquivo ou arquivos não encontrados.</body></html>";
			exit;
		}

		header("Pragma: public");
		header("Expires: 0");
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
		header("Cache-Control: private",false);
		header("Content-Type: application/zip");
		header("Content-Disposition: attachment; filename=".basename($archiveName).";" );
		header("Content-Transfer-Encoding: binary");
		header("Content-Length: ".filesize($archiveName));
		readfile("$archiveName");
		
	 }

}

Então eu montei uma página HTML com os nomes dos arquivos a serem baixados, cada qual com um checkbox de name arquivo[] ao seu lado. O value dos Checkboxes contém o nome do arquivo completo. O formulario dessa pagina HTML envia para a seguinte página os dados:

 

baixar_arquivo.php

ini_set("memory_limit", "2048M");
include_once("CreateZip.php");

// Verifica se usuário marcou os Checkboxes
if(!isset($_POST['arquivo'])){
	print "<script>alert('Para efetuar esta operação se faz necessário que você selecione ao menos um arquivo!')</script>";
	print "<script>window.location.replace('http://www.algumdominio.com.br')</script>";
}else{ // Caso haja Checkboxes marcados

$createZip = new createZip; 
$createZip -> addDirectory("documentos/"); // Nome da pasta onde os arquivos vão estar quando forem extraídos

	  // Faz loop pelo Array de Checkboxes
	  foreach($_POST['arquivo'] as $arquivo){
			$fileContents = file_get_contents($arquivo); //Inserir o nome do Arquivo
			$createZip -> addFile($fileContents, "documentos/$arquivo"); //Inserir nome da pasta e nome do arquivo
	  }


$fileName = "meu_arquivo.zip"; //Aqui você define o nome do arquivo ZIP
$fd = fopen ($fileName, "wb");
$out = fwrite ($fd, $createZip -> getZippedfile());
fclose ($fd);

$createZip -> forceDownload($fileName); //Possibilito o Download do arquivo Zip recém-criado
@unlink($fileName); //Excluo o arquivo logo após o Download efetuado
	  
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só estou tendo um problema nesse código... não consigo zipar e baixar grandes quantidades de arquivos. Por algum motivo o arquivo ZIP gerado quando se marca muitos checkboxes vêm corrompido...

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.