Descargue varios archivos como un archivo zip usando php


112

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


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.


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();

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.