【问题标题】:Zip PDF-Files download not workingZip PDF-文件下载不起作用
【发布时间】:2016-03-16 22:12:02
【问题描述】:

我正在构建一个界面,允许从服务器路径收集 PDF 文件以立即下载压缩文件,这在大多数情况下都可以正常工作。现在,一些 PDF 文件无法正常工作,这意味着如果 zip 包含其中一个无法正常工作的文件,则整个下载将不会执行。

现在我尝试了 许多 不同大小的文件。我可以看出大多数大于 10MB 的文件都无法正常工作,但有一个文件 (15mb) 可以正常工作,因此不会是导致此错误的文件大小 - 对吧?

发生的情况是根本没有下载。另外尝试阅读“$zip->addFile”和“$zip->close”的结果,但它都是正确的,即使不会执行下载。任何可能导致此错误的想法或至少一些有关如何找出此错误的提示?

过程中对变量的 (x) 调试检查在工作时间和不工作时间之间没有区别。唯一的区别是文件大小和-paths。

这是我用来构建 ZIP 的代码:

public function downloadFiles() {
        $myFiles = $this->Session->read('Files.MyFiles');
        if(count($myFiles)) {
            // build zip
            $zipname = 'amaz_photos_' . time() . '.zip';
            $zip = new ZipArchive();
            $zip->open($zipname, ZipArchive::CREATE);
            foreach($myFiles as $file) {
                if($file['type'] == 'directory') {
                    $dirName = str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/'))));
                    $zip->addEmptyDir($dirName);
                    $this->addFolderToZip($file['path'] . '/', $zip, $dirName . '/');
                } else {
                    $zip->addFile($file['path'], str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/')))));
                }
            }
            $zip->close();
            // get(send) zip
            header('Content-Type: application/zip');
            header('Content-disposition: attachment; filename=' . $zipname);
            header('Content-Length: ' . filesize($zipname));
            readfile($zipname);
            ignore_user_abort(true);
            unlink($zipname);
        }

        // clear "myFiles"
        //$this->Session->write('Files.MyFiles', array());

        $this->redirect(array(
            'controller' => 'pages',
            'action' => 'display'
        ));
    }

毕竟我尝试用几个 PDF 阅读器打开受影响的文件,包括 Adob​​e 的原始文件,以确定它是否损坏,但 ̶i̶t̶s̶ 似乎没有。

这将发生在可打开的 zip 文件中,但无论如何都不会开始下载。我发现在没有开始下载的特殊情况下,与它的工作时间相比,网络框架上没有设置响应头(“application/zip”)。

我发现的其他内容: 假设我有一个文件夹,里面有 20 个文件,不是下载。我尝试选择文件1-10:正在下载,然后我尝试下载文件11-20:正在下载,然后我尝试下载文件1-20:不下载,然后我尝试了两次混合模式,首先是偶数文件2,4 ,6,8..(1-20),之后奇数文件1,3,5,7,..(1-20):各不下载。 这表明 他的错误不属于特定文件

对如何确定此错误的触发器有什么建议吗?


更新:

我可以通过以下步骤下载生成的 zip 文件:

  1. 触发“创建和下载 zip 文件”

  2. 它会创建一个 zip 文件但不下载它

  3. 在代码中键入生成的 zip 文件文件名,以便在下一个过程中下载它(例如“$zipname = “generatedOnStep1.zip”)。

  4. 再次触发“创建和下载 zip 文件”

  5. 它不会下载(最近)生成的文件,而是我在步骤 1 中生成的文件。所以看起来:生成 Zip-Files 正在工作并且下载相同的 zip-File 正在工作,但不是一次且仅在一些未知的组合中。

...

更新 2:

由于我无法确定问题或修复它,我最终重新设计了整个过程,以重定向到生成的 zip 文件而不是“读取文件”它。某些功能必须采购,但无论如何它都是这样工作的。

【问题讨论】:

  • 您是否尝试过检查 zip 中 pdf 文件的大小?他们有尺码吗?与原始文件相比,大小是多少。你也没有给我们 addFolderToZip 的代码。
  • 在这种情况下不使用 addFolderToZip(),因为添加了单个文件。只是跳过。无论如何,你让我想到在下载文件后不要删除文件。 PDF 可以查看,大小比未压缩的大 2MB。所以看起来一切正常,但下载没有开始。我有可以下载的大型视频文件,所以我很确定它与任何内存限制无关。硬盘空间也很空(足够)。
  • 要明确一点:ZIP 生成正确,可以打开,PDF 可以查看。但下载并没有(仅)从特定的 PDF 开始。
  • 这种情况多久发生一次,您是否尝试过不删除生成的 zip 文件以查看 zip 文件中的实际内容或它们是否实际创建?您是否检查过 php 超时(运行时间限制或内存限制?)。没有下载,你得到一个空白页面(可能表示错误)?如果是这样,请检查 php / webserver 的错误日志。 (顺便说一句,time() 每秒唯一,请注意这一点,如果同时完成 2 个请求,可能会导致问题。也许可以尝试tempnam)。
  • 是的,我尝试保留这些文件。这将发生在可打开的 zip 文件中,但无论如何都不会开始下载。我发现在下载没有开始的特殊情况下,与它的工作时间相比,网络框架上没有设置响应头(“应用程序/zip”)。日志为空。

标签: php cakephp ziparchive


【解决方案1】:

试试这个...删除 readfile($zipname); 并将其替换为:

/* make sure no other functions
holding this file */
$filehandle = fopen($zipname, "r");

while (!feof($filehandle)) {
  /* lets read the file by pieces and
  send it to user's browser */
  echo fread($filehandle, 8192);
}

fclose($filehandle);

希望这会有所帮助。

【讨论】:

  • 它会导致相同的行为。如果我手动压缩,它会下载 zip,如果我通过 zipArchive 压缩,它会创建 zip,但不下载..这里正在发生一些不确定的奇迹..
  • 即使您的回答没有解决我的问题,它也让我重新设计了流程,在创建 zip 后重定向到文件。感谢您的产品。
  • 谢谢...如果您解决了问题,请告诉我...我看到您的问题已更新。我会根据您的更新进一步调查并通知您。
猜你喜欢
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2023-03-05
相关资源
最近更新 更多