web-dev-qa-db-fra.com

ZIP tous les fichiers du répertoire et téléchargez le .zip généré

Eh bien, tout d'abord, voici ma structure de dossiers:

images/

image1.png
image11.png
image111.png
image223.png
generate_Zip.php

Et voici le mien generate_Zip.php:

<?php

    $files = array($listfiles);

    $zipname = 'adcs.Zip';
    $Zip = new ZipArchive;
    $Zip->open($zipname, ZipArchive::CREATE);
    foreach ($files as $file) {
      $Zip->addFile($file);
    }
    $Zip->close();

    header('Content-Type: application/Zip');
    header("Content-Disposition: attachment; filename='adcs.Zip'");
    header('Content-Length: ' . filesize($zipname));
    header("Location: adcs.Zip");

    ?>

Comment rassembler tous les fichiers du dossier "images /", à l'exception de "generate_Zip.php", et en faire un .zip téléchargeable? Dans ce cas, le dossier "images /" a toujours une image différente. Est-ce possible?

29
Ygor Montenegro

cela garantira qu'aucun fichier avec l'extension .php ne sera ajouté:

   foreach ($files as $file) {
        if(!strstr($file,'.php')) $Zip->addFile($file);
    }

edit: voici le code complet réécrit:

<?php

    $zipname = 'adcs.Zip';
    $Zip = new ZipArchive;
    $Zip->open($zipname, ZipArchive::CREATE);
    if ($handle = opendir('.')) {
      while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != ".." && !strstr($entry,'.php')) {
            $Zip->addFile($entry);
        }
      }
      closedir($handle);
    }

    $Zip->close();

    header('Content-Type: application/Zip');
    header("Content-Disposition: attachment; filename='adcs.Zip'");
    header('Content-Length: ' . filesize($zipname));
    header("Location: adcs.Zip");

    ?>
26
skrilled

======= Solution de travail! ======

inclut tous les sous-dossiers:

new GoodZipArchive('path/to/input/folder',    'path/to/output_Zip_file.Zip') ;

au début, incluez ceci morceau de code .

58
T.Todua

Puisque vous avez juste besoin de fichiers spécifiques d'un répertoire pour créer ZipArchive, vous pouvez utiliser la fonction glob () pour ce faire.

<?php
    $Zip = new ZipArchive;
    $download = 'download.Zip';
    $Zip->open($download, ZipArchive::CREATE);
    foreach (glob("images/*.png") as $file) { /* Add appropriate path to read content of Zip */
        $Zip->addFile($file);
    }
    $Zip->close();
    header('Content-Type: application/Zip');
    header("Content-Disposition: attachment; filename = $download");
    header('Content-Length: ' . filesize($download));
    header("Location: $download");
 ?>

N'utilisez pas glob () si vous essayez de lister les fichiers dans un répertoire où beaucoup de fichiers sont stockés (plus de 100 000). Vous obtenez une erreur "Taille de mémoire autorisée d'octets XYZ épuisés ...".

readdir () est de manière plus stable.

1
way2vin

changez votre boucle foreach en ceci sauf generate_Zip.php

 foreach ($files as $file) {
     if($file != "generate_Zip.php"){
        $Zip->addFile($file);
     }
 }
0
shyammakwana.me
<?php 
ob_start();
$Zip = new ZipArchive; 
$Zip->open('sample.Zip',  ZipArchive::CREATE);
$srcDir = "C:\\xampp\\htdocs\\uploads"; //location of the directory
$files= scandir($srcDir);
print_r($files);  // to check if files are actually coming in the array

unset($files[0],$files[1]);
foreach ($files as $file) {
    $Zip->addFile($srcDir.'\\'.$file, $file);
    echo "bhandari";
}
$Zip->close();

$file='sample.Zip';
if (headers_sent()) {
    echo 'HTTP header already sent';
} else {
    if (!is_file($file)) {
        header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
        echo 'File not found';
    } else if (!is_readable($file)) {
        header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
        echo 'File not readable';
    } else {
        header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
        header("Content-Type: application/Zip");
        header("Content-Transfer-Encoding: Binary");
        header("Content-Length: ".filesize($file));
        header("Content-Disposition: attachment; filename=\"".basename($file)."\"");
        while (ob_get_level()) {
            ob_end_clean();
          }
        readfile($file);
        exit;
    }
}



?>`enter code here`

Remarque: N'oubliez pas d'utiliser ob_start (); et fin .

0
sawan