Foros del Web » Programando para Internet » PHP »

Comprimir directorios con php y descargarlos

Estas en el tema de Comprimir directorios con php y descargarlos en el foro de PHP en Foros del Web. Hola a todos!!!! Necesito que alguien me ayude a comprimir un directorio con varios archivos dentro, y luego me de la posibilidad de descargarmelo donde ...
  #1 (permalink)  
Antiguo 07/04/2008, 08:57
vtg
 
Fecha de Ingreso: marzo-2008
Mensajes: 15
Antigüedad: 16 años, 1 mes
Puntos: 0
Comprimir directorios con php y descargarlos

Hola a todos!!!!
Necesito que alguien me ayude a comprimir un directorio con varios archivos dentro, y luego me de la posibilidad de descargarmelo donde yo quiera, he estado mirando por internet y he encontrado una libreria llamada ZipArchive.lib.php que me permite hacer lo que yo quiero pero el problema es que la carpeta que necesitaria comprimir y descargar es mayor al que me deja esa libreria y no se como modificarla.
os adjunto la libreria ZipArchive vale?

<?php

/*
***** AlfaZoneSoft PHP program *****
[program]
Function or script name:
Zip Library
Project:
Xerowon
Maked: 2005 September - 2006 May
Wrote:
AlfaZonesoft, Szegedi Zoltán (Alias: Mágus, PHPMagus)
Original: PHPMyAdmin (GNU)
* http://www.pkware.com/business_and_developers/developer/popups/appnote.txt - .ZIP File Format Specification
[accessible]
E-mail:
[email protected], [email protected], [email protected]
Website:
http://alfazonesoft.ath.cx
MSN:
[email protected]
***** AlfaZoneSoft PHP program *****
*/

class zipArchive {
var $compressedData = array();
var $centralDirectory = array();
var $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $oldOffset = 0;

function addDir($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 addFile($filename, $directoryName) {
$data=file_get_contents($filename);
$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;
}

function addAuthor() {
/*$fp = fopen("zip_author_deletefile.deletefie_author_zip" ,"w");
fwrite($fp, "UMVista 360\n");
fwrite($fp, "\n");
fwrite($fp, "Web: http://alfazonesoft.ath.cx\n\n");
fwrite($fp, "A fájl elkészült: ".date("Y.m.d. H:i:s")."\n");
fclose($fp);
$this -> addFile("zip_author_deletefile.deletefie_author_zi p","zipinfo.txt");
unlink("zip_author_deletefile.deletefie_author_zip ");*/
}

function getZip() {
$this -> addAuthor();
$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 saveZip($filename) {
$fp = fopen ($filename, "wb");
fwrite ($fp, $this -> getZip());
fclose ($fp);
}

function downloadZip($filename) {
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
elseif ( ! file_exists( $filename ) ) {
echo "<html><title>Archivo no encontrado</title><body><b>Error::</b> El archivo no fue encontrado.</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($filename).";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

}
}
?>

Un saludo a todos
  #2 (permalink)  
Antiguo 08/04/2008, 16:58
 
Fecha de Ingreso: noviembre-2005
Ubicación: Torreon Coahuila
Mensajes: 100
Antigüedad: 18 años, 5 meses
Puntos: 1
Re: Comprimir directorios con php y descargarlos

Aqui estamos para ayudarnos

Esta es la libreria guardala como libreria_zipfile.php

Código PHP:
<?php 

// Class definition found at http://www.zend.com/zend/spotlight/c...zip-files3.php
// Some alterations to the original posted code were made in order to get everything working properly
// See example usage at the bottom of this page

class zipfile
{
var 
$datasec = array();
var 
$ctrl_dir = array();
var 
$eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00";
var 
$old_offset 0

function 
add_dir($name) {
$name str_replace("""/"$name); 

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

$fr .= pack("V",0);
$fr .= pack("V",0);
$fr .= pack("V",0);
$fr .= pack("v"strlen($name) );
$fr .= pack("v");
$fr .= $name;
$fr .= pack("V"0);
$fr .= pack("V"0);
$fr .= pack("V"0); 

$this -> datasec[] = $fr;
$new_offset strlen(implode(""$this->datasec)); 

$cdrec "\x50\x4b\x01\x02";
$cdrec .="\x00\x00";
$cdrec .="\x0a\x00";
$cdrec .="\x00\x00";
$cdrec .="\x00\x00";
$cdrec .="\x00\x00\x00\x00";
$cdrec .= pack("V",0);
$cdrec .= pack("V",0);
$cdrec .= pack("V",0);
$cdrec .= pack("v"strlen($name) );
$cdrec .= pack("v");
$cdrec .= pack("v");
$cdrec .= pack("v");
$cdrec .= pack("v");
$ext="\x00\x00\x10\x00";
$ext="\xff\xff\xff\xff";
$cdrec .= pack("V"16 );
$cdrec .= pack("V"$this -> old_offset );
$cdrec .= $name

$this -> ctrl_dir[] = $cdrec;
$this -> old_offset $new_offset;
return;


function 
add_file($data$name) {
$fp fopen($data,"r");
$data fread($fp,filesize($data));
fclose($fp);
$name str_replace("""/"$name);
$unc_len strlen($data);
$crc crc32($data);
$zdata gzcompress($data);
$zdata substr ($zdata2, -4);
$c_len strlen($zdata);
$fr "\x50\x4b\x03\x04";
$fr .= "\x14\x00";
$fr .= "\x00\x00";
$fr .= "\x08\x00";
$fr .= "\x00\x00\x00\x00";
$fr .= pack("V",$crc);
$fr .= pack("V",$c_len);
$fr .= pack("V",$unc_len);
$fr .= pack("v"strlen($name) );
$fr .= pack("v");
$fr .= $name;
$fr .= $zdata;
$fr .= pack("V",$crc);
$fr .= pack("V",$c_len);
$fr .= pack("V",$unc_len); 

$this -> datasec[] = $fr;
$new_offset strlen(implode(""$this->datasec)); 

$cdrec "\x50\x4b\x01\x02";
$cdrec .="\x00\x00";
$cdrec .="\x14\x00";
$cdrec .="\x00\x00";
$cdrec .="\x08\x00";
$cdrec .="\x00\x00\x00\x00";
$cdrec .= pack("V",$crc);
$cdrec .= pack("V",$c_len);
$cdrec .= pack("V",$unc_len);
$cdrec .= pack("v"strlen($name) );
$cdrec .= pack("v");
$cdrec .= pack("v");
$cdrec .= pack("v");
$cdrec .= pack("v");
$cdrec .= pack("V"32 );
$cdrec .= pack("V"$this -> old_offset ); 

$this -> old_offset $new_offset

$cdrec .= $name;
$this -> ctrl_dir[] = $cdrec;


function 
file() {
$data implode(""$this -> datasec);
$ctrldir implode(""$this -> ctrl_dir); 

return
$data .
$ctrldir .
$this -> eof_ctrl_dir .
pack("v"sizeof($this -> ctrl_dir)) .
pack("v"sizeof($this -> ctrl_dir)) .
pack("V"strlen($ctrldir)) .
pack("V"strlen($data)) .
"\x00\x00";
}
}
?>

Y aqui un ejemplo


ejemplo.php

Código PHP:

<?
require "libreria_zipfile.php"// Get the zipfile class
$zipTest = new zipfile();
//$zipTest->add_dir("imagenes_dictamen/");
$zipTest->add_file("fotos/foto1.jpg""1/foto1.jpg");
$zipTest->add_file("fotos/foto2.jpg""2/foto2.jpg");
$zipTest->add_file("fotos/foto3.jpg""3/foto3.jpg");

// Return Zip File to Browser
Header("Content-type: application/octet-stream");
Header("Content-disposition: attachment; filename=archivos_descargados_cliente.zip");
echo 
$zipTest->file();


//$filename = "archivos_guardados_servidor.zip";
//$fd = fopen ($filename, "wb");
//$out = fwrite ($fd, $zipTest -> file());
//fclose ($fd);

//echo "Click para <a href='archivos_guardados_servidor.zip'> DESCARGAR</a> archivo comprimido.";

?>
Lo que hace es que te comprime las imagenes que le pases y te descarga el archivo, tmb se podria grabar el archivo en el servidor descomentando las lineas.

Y si los archivos son muy grandes no los descargues, mejor guardalos en el servidor

Cita:

//$filename = "archivos_guardados_servidor.zip";
//$fd = fopen ($filename, "wb");
//$out = fwrite ($fd, $zipTest -> file());
//fclose ($fd);

//echo "Click para <a href='archivos_guardados_servidor.zip'> DESCARGAR</a> archivo comprimido.";

Última edición por losporros; 08/04/2008 a las 17:03
  #3 (permalink)  
Antiguo 10/04/2008, 09:07
vtg
 
Fecha de Ingreso: marzo-2008
Mensajes: 15
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: Comprimir directorios con php y descargarlos

Hola!!!
gracias por la libreria, la verdad que es parecida a la que teniamos, pero lo que me has mandado no me resuelve mi duda, ya que lo que me pasa es que necesito hacer descargas de archivos grandes de mas de 2MB y estas librerias no me dejan.
Si alguien sabe de algo de esto por favor ayudenme vale?
gracias por todo
  #4 (permalink)  
Antiguo 10/04/2008, 09:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 1 mes
Puntos: 2534
Re: Comprimir directorios con php y descargarlos

conoces la libreria ZIP, de PHP?? ((deberias verle a ella... ya que son librerias compiladas y no clases)) quiza, ayude... Pregunta a Google
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:00.