Laden Sie mehrere Dateien als Zip-Datei mit PHP herunter

112

Wie kann ich mit PHP mehrere Dateien als Zip-Datei herunterladen?

Zoe
quelle
Sie können die Klassenbibliothek xip.lib.php verwenden. zip.lib.php Beispiele finden Sie in diesem Artikel
Abdel Raoof

Antworten:

212

Mit der ZipArchiveKlasse können Sie eine ZIP-Datei erstellen und an den Client streamen. Etwas wie:

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

und um es zu streamen:

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

In der zweiten Zeile wird der Browser gezwungen, dem Benutzer ein Download-Feld anzuzeigen, und der Name filename.zip wird angezeigt. Die dritte Zeile ist optional, aber bestimmte (hauptsächlich ältere) Browser haben in bestimmten Fällen Probleme, ohne dass die Inhaltsgröße angegeben wird.

Cletus
quelle
4
Sollte es nicht $zip = new ZipArchive;statt sein $zip = new ZipFile;?
Matthieu
@Matthieu Die Klammern sind nicht erforderlich. Schauen Sie sich Beispiele an: php.net/manual/en/ziparchive.open.php
Lars Gyrup Brink Nielsen
1
Was soll die Variable $ zipfilename bedeuten?
Pascal Klein
$ zipfilename sollte $ zipname lauten - dies ist der Dateiname der erstellten Zip-Datei als Zeichenfolge.
Chris
1
Es funktioniert nicht in Windows Standard Zip Opener, aber funktioniert in Win Zipper oder 7-Zip. Ich versuche, Bild in Zip-Ordner hinzuzufügen und dann als Zip herunterzuladen
RN Kushwaha
36

Dies ist ein funktionierendes Beispiel für das Erstellen von ZIPs in 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();
Sonnenliebe
quelle
2
Diese Antwort funktioniert! Der Unterschied ist addFromString, addFile ist schlecht codiert.
André Catita
1

Sie sind bereit für PHP Zip Lib und können auch Zend Zip Lib verwenden.

<?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/

und es gibt auch php pear lib für diese http://www.php.net/manual/en/class.ziparchive.php

dev.meghraj
quelle