Be wary that there are several algorithms to generate a zip file. I found that Office OpenXML files created with ZipArchive are not recognized by Excel 2007, for example.
You have to use a different class to zip in this case, such as PclZip.
The ZipArchive class
Introducción
Un fichero, comprimido con Zip.
Clases sinopsis
ZipArchive
{
/* Propiedades */
/* Métodos */
bool addFile
( string $filename
[, string $localname = NULL
[, int $start = 0
[, int $length = 0
]]] )
}Propiedades
- status
-
Estado del archivo Zip
- statusSys
-
Estado del sistema del archivo Zip
- numFiles
-
Número de ficheros en el archivo
- filename
-
Nombre del archivo en le sistema de archivos
- comment
-
Comentario para el archivo
Table of Contents
- ZipArchive::addEmptyDir — Añadir un nuevo directorio
- ZipArchive::addFile — Añade un fichero al archivo ZIP para la ruta dada
- ZipArchive::addFromString — Añadir un fichero al archivo ZIP usando su contenido
- ZipArchive::close — Cierra el fichero activo (abierto o el nuevo creado)
- ZipArchive::deleteIndex — Elimina una entrada en el archivo usando su índice
- ZipArchive::deleteName — Elimina una entrada en el archivo por su nombre
- ZipArchive::extractTo — Extraer el contenido del archivo
- ZipArchive::getArchiveComment — Devuelve el comentario del archivo ZIP
- ZipArchive::getCommentIndex — Devuelve el comentario de una entrada usando la entrada díndice
- ZipArchive::getCommentName — Devuelve el comentario de una entrada usando el nombre de la entrada
- ZipArchive::getFromIndex — Devuelve el contenido de la entrada usando su índice
- ZipArchive::getFromName — Devuelve el contenido de la entrada utilizando su nombre
- ZipArchive::getNameIndex — Devuelve el nombre de una entrada utilizando su índice
- ZipArchive::getStatusString — Devuelve mensajes de: estado de error, de sistema y/o mensajes de zip
- ZipArchive::getStream — Obtener un manejador de fichero para la entrada definido por su nombre (sólo lectura)
- ZipArchive::locateName — Devuelve el índice de la entrada en el archivo
- ZipArchive::open — Abrir un fichero de archivo en formato ZIP
- ZipArchive::renameIndex — Renombra una entrada definida por su índice
- ZipArchive::renameName — Renombra una entrada definida por su nombre
- ZipArchive::setArchiveComment — Establece el comentario de un archivo ZIP
- ZipArchive::setCommentIndex — Establece el comentario de una entrada definido por su índice
- ZipArchive::setCommentName — Establece el comentario de una entrada definido por su nombre
- ZipArchive::statIndex — Obtiene los detalles de una entrada definida por su índice
- ZipArchive::statName — Obtener los detalles de una entrada definida por su nombre
- ZipArchive::unchangeAll — Deshacer todos los cambios hechos en el archivo
- ZipArchive::unchangeArchive — Revertir todos los cambios globales hechos en el archivo
- ZipArchive::unchangeIndex — Revertir todos los cambios hechos a una entrada en el índice dado
- ZipArchive::unchangeName — Deshace todos los cambios realizados a una entrada con un nombre dado
h-fate at gmx dot net
05-Oct-2010 11:17
hardcorevenom at gmx dot com
15-Jun-2010 10:17
Read a file from an archive to a variable.
A warning is printed automatically in case of a CRC32 mismatch, which we capture, so we can print our own error message.
<?php
$zip = new ZipArchive();
if ($zip->open('archive.zip')) {
$fp = $zip->getStream('myfile.txt'); //file inside archive
if(!$fp)
die("Error: can't get stream to zipped file");
$stat = $zip->statName('myfile.txt');
$buf = ""; //file buffer
ob_start(); //to capture CRC error message
while (!feof($fp)) {
$buf .= fread($fp, 2048); //reading more than 2156 bytes seems to disable internal CRC32 verification (bug?)
}
$s = ob_get_contents();
ob_end_clean();
if(stripos($s, "CRC error") != FALSE){
echo 'CRC32 mismatch, current ';
printf("%08X", crc32($buf)); //current CRC
echo ', expected ';
printf("%08X", $stat['crc']); //expected CRC
}
fclose($fp);
$zip->close();
//Done, unpacked file is stored in $buf
}
?>
To create a corrupt file, change a byte in a zip file using a hex editor.
