Crear ficheros .zip en PHP


En esta entrada se explica como comprimir algun fichero al vuelo (on the fly) de manera sencilla desde PHP.  Pulse en Leer más para ver el manual.

Al principio de nuestro fichero añadimos la siguiente función:


// Función para crear un fichero .zip a partir de un array de contenidos pasado como parámetro.
 function createzip($struct,$namezip=0)
 { 	$ZipData = array();
 $Dircont = array();
 $DirFile = array();
 $offseto = 0;
 while(list($file,$data)=each($struct))
 {	$file= str_replace("\\", "/", $file);
 $dir=explode("/",$file);
 for($i=0; $i<sizeof($dir); $i++)if($dir[$i]=="")unset($dir[$i]);
 $num=count($dir); //Total de niveles
 $ele=0;  		  //Nivel actual
 $dirname="";	  //Nombre archivo o directorio
 while(list($idx,$val)=each($dir))
 {	$ty=(++$ele)==$num?true:false;
 $ty=trim($data)!=""?$ty:false;//Compruebar si el ultimo elemento es directorio o archivo
 $dirname.=$val.($ty?"":"/");
 if(isset($DirFile[$dirname]))continue; else $DirFile[$dirname]=true;
 $gzdata="";
 if($ty)
 {	$unziplen=strlen($data);
 $czip=crc32($data);
 $gzdata=gzcompress($data);
 $gzdata=substr(substr($gzdata,0,strlen($gzdata)-4),2);
 $cziplen=strlen($gzdata);
 }
 $ZipData[]="\x50\x4b\x03\x04".($ty?"\x14":"\x0a")."\x00\x00\x00".($ty?"\x08":"\x00")."\x00\x00\x00\x00\x00".
 pack("V",$ty?$czip:0).pack("V",$ty?$cziplen:0).pack("V",$ty?$unziplen:0).pack("v",strlen($dirname)).
 pack("v",0).$dirname.$gzdata.pack("V",$ty?$czip:0).pack("V",$ty?$cziplen:0).pack("V",$ty?$unziplen:0);
 $Dircont[]="\x50\x4b\x01\x02\x00\x00".($ty?"\x14":"\x0a")."\x00\x00\x00".($ty?"\x08":"\x00")."\x00\x00\x00\x00\x00".
 pack("V",$ty?$czip:0).pack("V",$ty?$cziplen:0).pack("V",$ty?$unziplen:0).pack("v",strlen($dirname)).
 pack("v", 0 ).pack("v",0).pack("v",0).pack("v",0).pack("V",$ty?32:16).pack("V",$offseto).$dirname;
 $offseto=strlen(implode("",$ZipData));
 }//Fin While dir
 }//Fin While archivos
 $data = implode("",$ZipData);
 $cdir = implode("",$Dircont);
 $data=$data.$cdir."\x50\x4b\x05\x06\x00\x00\x00\x00".pack("v",sizeof($Dircont)).pack("v",sizeof($Dircont)).pack("V",strlen($cdir)).pack("V",strlen($data))."\x00\x00";
 if($namezip)//Construir el archivo
 {	if(($fp=fopen($namezip,"wb")))
 {	fwrite($fp,$data);
 fclose ($fp);
 return true;
 }else return false;
 }else return $data;
 }

A continuación, se obtiene el contenido del fichero el cual se desea comprimir en un .zip:

$cont=array("Fichero.txt"=>$ContTxt);

Donde $ContTxt es el contenido del fichero. Luego, llamamos  a la función createzip() pasándole como parámetro el array de los contenidos.  Es importante, especificar las cabeceras y donde indicaremos el nombre del fichero:

$data=createzip($cont);
 header('Content-type: application/octetstream');
header('Content-Disposition: attachment; filename="'nom_fichero.zip"');

A continuación, podemos ver otro ejemplo donde se genera un archivo .zip con varios ficheros:

<?
include("createzip.php");
$cont=array("leerme.txt"=>"Este es un archivo generado a ".date("Y-m-d H:i:s"),
 "foto.jpg"=> file_get_contents("img/foto.jpg"),
 "dir1/dir2/dir3/color.txt"=>"color",
 "otrodir/demo"=>""
 );
createzip($cont,"tmp/demozip.zip") or die("Error: al construir el ZIP.");
?>
Anuncios

Acerca de tryorcatch

Información no relevante. Ver todas las entradas de tryorcatch

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: