Pobierz wiele plików jako plik zip za pomocą php

112

Jak mogę pobrać wiele plików jako plik zip za pomocą php?

Zoe
źródło
Możesz użyć biblioteki klasy xip.lib.php. zip.lib.php Przykłady można znaleźć w tym artykule
Abdel Raoof,

Odpowiedzi:

212

Możesz użyć tej ZipArchiveklasy, aby utworzyć plik ZIP i przesłać go strumieniowo do klienta. Coś jak:

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

i do streamowania:

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

Drugi wiersz zmusza przeglądarkę do przedstawienia użytkownikowi okna pobierania i wyświetla monit o nazwę nazwa_pliku.zip. Trzecia linia jest opcjonalna, ale niektóre (głównie starsze) przeglądarki mają w niektórych przypadkach problemy bez określania rozmiaru zawartości.

cletus
źródło
4
Czy nie powinno być $zip = new ZipArchive;zamiast tego $zip = new ZipFile;?
Matthieu
@Matthieu Nawiasy nie są konieczne. Spójrz na przykłady: php.net/manual/en/ziparchive.open.php
Lars Gyrup Brink Nielsen
1
Co ma oznaczać zmienna $ zipfilename?
Pascal Klein,
$ zipfilename powinno brzmieć $ zipname - jest to nazwa pliku utworzonego pliku zip w postaci ciągu.
Chris
1
Nie działa w domyślnym otwieraczu zamków systemu Windows, ale działa w suwaku win lub 7-zip. Próbuję dodać obraz do folderu zip, a następnie pobrać jako zip
RN Kushwaha
36

Oto działający przykład tworzenia plików ZIP w 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();
Sun Love
źródło
2
Ta odpowiedź działa! Różnica to addFromString, addFile jest źle zakodowana.
André Catita,
1

Jesteś gotowy do korzystania z php zip lib i możesz również używać 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/

jest też biblioteka php pear dla tego http://www.php.net/manual/en/class.ziparchive.php

dev.meghraj
źródło