web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルを圧縮し、生成された.zipをダウンロードします

まあ、まず第一に、これは私のフォルダ構造です:

images/

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

そして、これは私の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");

    ?>

「generate_Zip.php」を除く「images /」フォルダーからすべてのファイルを収集し、ダウンロード可能な.zipにする方法は?この場合、「images /」フォルダには常に異なる画像があります。それは可能ですか?

29
Ygor Montenegro

これにより、拡張子が.phpのファイルが追加されなくなります。

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

編集:ここに完全に書き換えられたコードがあります:

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

=======実用的なソリューション!======

すべてのサブフォルダーが含まれます:

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

最初に、これを含めます コードの一部

58
T.Todua

ZipArchiveを作成するためにディレクトリから特定のファイルが必要なだけなので、これを行うには glob() 関数を使用できます。

<?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");
 ?>

非常に多くのファイル(100.000以上)が格納されているディレクトリ内のファイルをリストしようとする場合は、glob()を使用しないでください。 「XYZバイトのメモリサイズを使い果たしました...」エラーが表示されます。

readdir() はより安定した方法です。

1
way2vin

foreachループを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`

注:ob_start()の使用を忘れないでください。そして終わり 。

0
sawan