我正在构建一个接口,允许从服务器路径收集PDF文件,以便立即下载它们,这在大多数情况下都可以正常工作。现在,一些PDF文件不起作用,意味着如果zip包含一个非工作文件,整个下载将不会执行。
现在我尝试使用不同大小的许多文件。我可以告诉大多数大于10MB的文件不起作用,但是一个文件(15mb)正在工作,所以它不能是文件大小导致这个错误 - 对吗?
发生的事情是根本没有下载。另外尝试阅读“$ zip-> addFile”和“$ zip-> close”的结果,但即使不执行下载也是如此。任何可能导致此错误的想法或至少一些关于如何找到它的提示?
过程中变量的(x)调试检查在工作时间和不工作时间之间没有差异。只有差异是文件大小和路径。
以下是我用来构建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的原版,以确定它是否破损,但似乎没有。
这将在可打开的zip文件中发生,但无论如何都不会开始下载。我发现在下载没有开始的特殊情况下,网络框架上没有设置响应标头(“application / zip”)与工作时间相比。
我发现了什么: 可以说我有一个包含20个文件的文件夹,不能下载。我尝试选择文件1-10:下载,然后我尝试下载文件11-20:下载,然后我尝试下载文件1-20:不下载,然后我尝试了两次混合模式,首先是偶数文件2,4 ,6,8 ..(1-20),之后奇数文件1,3,5,7,...(1-20):每个都不下载。 这说明t 他的错误不属于特定文件。
有关如何确定此错误触发器的任何建议吗?
更新
我能够下载生成的zip文件,执行以下步骤:
触发'创建&下载zip文件'
它会创建一个zip文件,但不会下载
在代码中键入生成的zip文件文件名,以便在下一个程序中下载(例如“$ zipname =”generatedOnStep1.zip“)。
- 触发'创建&再次下载zip文件
- 它不会下载(最近)生成的文件,而是我在步骤1中生成的文件。所以看起来:生成Zip文件正在工作并下载相同的zip文件正在工作,但不是一次只能在一些未知的组合中。
醇>
...
更新2:
由于我无法确定问题或修复它,我最终重新设计了整个过程,重定向到生成的zip文件而不是“readfile”。有些功能必须来源,但无论如何它都是这样工作的。
答案 0 :(得分: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);
希望这有帮助。