Descargue varios archivos como un archivo zip usando php

112

¿Cómo puedo descargar varios archivos como un archivo zip usando php?

Zoe
fuente
Puede utilizar la biblioteca de clase xip.lib.php. zip.lib.php Para ver ejemplos, consulte este artículo
Abdel Raoof

Respuestas:

212

Puede usar la ZipArchiveclase para crear un archivo ZIP y transmitirlo al cliente. Algo como:

$files = array('readme.txt', 'test.html', 'image.gif');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
  $zip->addFile($file);
}
$zip->close();

y para transmitirlo:

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

La segunda línea obliga al navegador a presentar un cuadro de descarga al usuario y solicita el nombre filename.zip. La tercera línea es opcional, pero algunos navegadores (principalmente antiguos) tienen problemas en ciertos casos sin que se especifique el tamaño del contenido.

cletus
fuente
4
¿No debería ser en $zip = new ZipArchive;lugar de $zip = new ZipFile;?
Matthieu
@Matthieu Los paréntesis no son necesarios. Mire en ejemplos: php.net/manual/en/ziparchive.open.php
Lars Gyrup Brink Nielsen
1
¿Qué se supone que significa la variable $ zipfilename?
Pascal Klein
$ zipfilename debería leer $ zipname - es el nombre de archivo del zip creado como una cadena.
Chris
1
No funciona en el abridor de cremallera predeterminado de Windows, pero funciona en win zipper o 7-zip. Estoy tratando de agregar una imagen en la carpeta zip y luego descargarla como zip
RN Kushwaha
36

Este es un ejemplo práctico de cómo hacer ZIP en PHP:

$zip = new ZipArchive();
$zip_name = time().".zip"; // Zip name
$zip->open($zip_name,  ZipArchive::CREATE);
foreach ($files as $file) {
  echo $path = "uploadpdf/".$file;
  if(file_exists($path)){
  $zip->addFromString(basename($path),  file_get_contents($path));  
  }
  else{
   echo"file does not exist";
  }
}
$zip->close();
Sol amor
fuente
2
¡Esta respuesta funciona! La diferencia es addFromString, addFile está mal codificado.
André Catita
1

Ya está listo para usar php zip lib y también puede usar zend zip lib,

<?PHP
// create object
$zip = new ZipArchive();   

// open archive 
if ($zip->open('app-0.09.zip') !== TRUE) {
    die ("Could not open archive");
}

// get number of files in archive
$numFiles = $zip->numFiles;

// iterate over file list
// print details of each file
for ($x=0; $x<$numFiles; $x++) {
    $file = $zip->statIndex($x);
    printf("%s (%d bytes)", $file['name'], $file['size']);
    print "
";    
}

// close archive
$zip->close();
?>

http://devzone.zend.com/985/dynamically-creating-compressed-zip-archives-with-php/

y también hay php pear lib para este http://www.php.net/manual/en/class.ziparchive.php

dev.meghraj
fuente