PHP - 在打开时创建并下载 ZipArchive returns CPGZ

PHP - Create and download ZipArchive returns CPGZ when opening

该函数似乎没有正确创建 ZIP 文件。文件下载提示工作正常。但是,当打开它时,它只会创建 .cpgz 格式的副本。

供参考: foreach ($attachments as $file) 输出为 "/upload/image.jpg"

function downloadAttachment() {
    $zipname = 'attachments.zip';
    $zip = new ZipArchive;
    $zip->open($zipname, ZipArchive::CREATE);
    foreach ($attachments as $file) {
      $fileSrc = $_SERVER['DOCUMENT_ROOT'] . $file["file_attachment"];
      $zip->addFile($fileSrc);
    }
    $zip->close();

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

您可以使用 dirname(__FILE__) - 它 return 您当前 php 脚本的绝对路径,制作 var_dump( dirname(__FILE__) ) 以查看它给您的内容,然后使用 ..//folders/.. 到您的附件目录

所以你的 $zipname 将类似于 $zipname = dirname(__FILE__) .'/../some_folders/attachements/attachments.zip';

并确保该目录可由 www-data 用户写入或仅 chmod0777 在任何情况下

__FILE__ 是 PHP 的神奇常量之一,您可以在此处查看更多 - http://php.net/manual/en/language.constants.predefined.php

另一个好的做法是在 configs.php 中的某个地方定义它包含在每个 php define('ROOT_DIR', "absolute root path of your project"); 中,然后在项目的任何地方使用 ROOT_DIR 变量作为所有前缀文件夹 ROOT_DIR."/folder/file ..."