Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/04/2008, 16:58
losporros
 
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