33

まず、これが私のフォルダ構造です。

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

    ?>

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

4

6 に答える 6

66

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

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

new GoodZipArchive('path/to/input/folder',    'path/to/output_zip_file.zip') ;

最初に、このコードを含めます。

于 2013-10-18T14:17:35.733 に答える
30

これにより、拡張子が .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");

    ?>
于 2013-07-17T19:28:39.570 に答える
1

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()はより安定した方法です。

于 2013-07-17T19:53:34.800 に答える
0

foreach ループをこれに変更して除くgenerate_zip.php

 foreach ($files as $file) {
     if($file != "generate_zip.php"){
        $zip->addFile($file);
     }
 }
于 2013-07-17T19:45:03.293 に答える