Inicio / Preguntas / archivos zip

Pregunta: archivos zip

06 de Marzo de 2008 - Pregunta realizada por Sergio
Buenos dias, antes de nada me gustaria presentarme, mi nombre es Sergio Molina y trabajo profesionalmente sobre php. Mi duda es la siguiente: Estoy trabajando sobre php 5.2.2 y estoy intentando trabajar con ficheros zip, para ello utilizo la clase ZipArchive que esta dentro del nucleo de php, me deja abrir el fichero sin problemas y cuando voy a descomprimirlo con la instruccion: \'$ziq->extractTo(\".\");\' ($zip es el objeto de tipo ZipArchive que me he creado). En un principio parace que funciona sin problemas, el problema es que los archivos me los descomprime con tamaño 0bytes y estan vacios evidentemente. No se si te servira de algo, pero los ficheros zip contienen archivos de tipo htm o imagenes en gif. Agradeceria cualquier tipo de orientacion, incluso si conoces alguna otra forma mejor de hacerlo, estoy abierto a sugerencias. Si tienes alguna duda o quieres ver el codigo completo, tan solo pidemelo. Un saludo y gracias por tu tiempo
15 de Marzo de 2008 - Respuesta de Arturo Paredes
Hola que tal, antes que nada te pido disculpas por escribirte con un par de dias de retraso.

Para saber que error tienes por supuesto que debemos revisar el codigo fuente que estas creando ya que no se puede saber a ciencia cierta que es lo que ocurre asi nadamas.

Si quieres enviamelo y lo revisamos, de todas maneras te envio el siguiente codigo que sirve tambien para crear zip.

include(\"createzip.php\");

$cont=array(\"leerme.txt\"=>\"Este texto se muestra en un archivo leeme que se genera al vuelo\",
\"Foto.jpg\"=> file_get_contents(\"img/foto.jpg\"),
\"pagina2.html\"=> file_get_contents(\"index.html\"),
);

$data=createzip($cont);

header(\"Pragma: public\");
header(\"Expires: 0\");
header(\"Cache-Control: must-revalidate, post-check=0, pre-check=0\");
header(\"Cache-Control: private\",false);
header(\"Content-Description: File Transfer\");
header(\"Content-Type: application/force-download\");
header(\"Content-Length: \" . strlen($data));
header(\"Content-Disposition: attachment; filename=Archivocomprimido.zip\");
echo $data;
?>


Createzip.php
-----------------------------------------------------
/* Autor: Martin R. Mondragon Sotelo
e-mail: martin@mygnet.com
*/
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 $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;
}

?>
------------------------------------


Estoy a tus ordenes.

Atte: Arturo Paredes
Wikis recomendados
La cocina española es rica en salsas sobre la base de cebollas, tomates ajíes; cazuelas... Más »
Amplio tutorial de Java para empezar a trabajar y ampliar conocimientos de este lenguaje.
Hablar de redes de ordenadores siempre implica hablar de Unix. Por supuesto, Unix no es... Más »
A lo largo de este trabajo se va a intentar hacer un repaso de los... Más »
''Nunca un filósofo ha expresado en libros sus opiniones auténticas y últimas: ¿no se escriben... Más »
Opinión introducida con éxito.
Por favor, escribe correctamente el código que aparece en la imagen
El usuario ya existe en nuestra base de datos. Introduce tu email y password para identificarte y poder opinar.
La contraseña es incorrecta.
Error insertando opinión, por favor, inténtelo de nuevo.