Téléchargez plusieurs fichiers sous forme de fichier zip en utilisant php

112

Comment puis-je télécharger plusieurs fichiers sous forme de fichier zip en utilisant PHP?

Zoé
la source
Vous pouvez utiliser la bibliothèque de classe xip.lib.php. zip.lib.php Pour des exemples, reportez-vous à cet article
Abdel Raoof

Réponses:

212

Vous pouvez utiliser la ZipArchiveclasse pour créer un fichier ZIP et le diffuser au client. Quelque chose comme:

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

et pour le diffuser:

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

La deuxième ligne force le navigateur à présenter une boîte de téléchargement à l'utilisateur et lui demande le nom filename.zip. La troisième ligne est facultative mais certains navigateurs (principalement plus anciens) ont des problèmes dans certains cas sans que la taille du contenu ne soit spécifiée.

cletus
la source
4
Ne devrait-il pas être à la $zip = new ZipArchive;place de $zip = new ZipFile;?
Matthieu
@Matthieu Les parenthèses ne sont pas nécessaires. Regardez dans les exemples: php.net/manual/en/ziparchive.open.php
Lars Gyrup Brink Nielsen
1
Que signifie la variable $ zipfilename?
Pascal Klein
$ zipfilename devrait lire $ zipname - c'est le nom de fichier du zip créé sous forme de chaîne.
Chris
1
Il ne fonctionne pas dans l'ouvre-zip par défaut de Windows, mais fonctionne avec win zipper ou 7-zip. J'essaie d'ajouter une image dans le dossier zip, puis de la télécharger au format zip
RN Kushwaha
36

Voici un exemple de travail de création de 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();
Amour du soleil
la source
2
Cette réponse fonctionne! La différence est addFromString, addFile est mal codé.
André Catita
1

Vous êtes prêt à utiliser php zip lib, et pouvez également utiliser 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/

et il y a aussi php pear lib pour cela http://www.php.net/manual/en/class.ziparchive.php

dev.meghraj
la source