【发布时间】: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 阅读器打开受影响的文件,包括 Adobe 的原始文件,以确定它是否损坏,但 ̶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 文件:
触发“创建和下载 zip 文件”
它会创建一个 zip 文件但不下载它
在代码中键入生成的 zip 文件文件名,以便在下一个过程中下载它(例如“$zipname = “generatedOnStep1.zip”)。
再次触发“创建和下载 zip 文件”
它不会下载(最近)生成的文件,而是我在步骤 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