Zip PDF文件下载无效

时间:2014-11-24 15:06:13

标签: php cakephp ziparchive

我正在构建一个接口,允许从服务器路径收集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文件,执行以下步骤:

     
      
  1. 触发'创建&下载zip文件'

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

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

  6.   
  7. 触发'创建&再次下载zip文件
  8.   
  9. 它不会下载(最近)生成的文件,而是我在步骤1中生成的文件。所以看起来:生成Zip文件正在工作并下载相同的zip文件正在工作,但不是一次只能在一些未知的组合中。
  10.   

...

  

更新2:

     

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

1 个答案:

答案 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);

希望这有帮助。