2014-11-24 52 views
0

我正在构建一个接口,允许从服务器路径收集PDF文件以立即下载它们,大部分时间工作正常。现在,一些PDF文件无法正常工作,这意味着如果zip包含一个非工作文件,则整个下载将不会执行。邮编PDF文件下载不起作用

现在我试着很多文件大小不同。我可以告诉大多数大于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的原有以确定其破裂打开受感染的文件后,但其IT似乎不是。

这将发生在可打开的zip文件中,但下载无法启动。我发现,在下载无法启动的特殊情况下,与其工作时间相比,在网络帧上没有设置响应头(“application/zip”)。

我发现了什么: 可以说我有一个文件夹中有20个文件,这不是下载。我尝试选择文件1-10:下载,然后我尝试下载文件11-20:下载,然后我试图下载文件1-20:不下载,然后我尝试了两次混合模式,首先是偶数文件2,4 ,6,8 ..(1-20),之后的奇数文件1,3,5,7,..(1-20):每个都不下载。 这说明t 他错误不属于特定文件

任何建议如何确定此错误的触发器?


更新:

我能够下载生成的压缩文件做下列步骤操作:

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

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

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

  4. 触发‘创建&下载zip文件’再次
  5. 它不下载(最近)生成的文件,但我在步骤1中生成的文件。所以它似乎是:生成Zip文件正在工作,并下载相同的zip文件正在工作,但不是一次,只有在一些未知的组合。

...

更新2:

因为我无法确定问题,也没有解决这个问题,我结束了重新设计的全过程,重定向到产生zip文件而不是“readfile”它。一些功能必须被发现,但无论如何它都以这种方式工作。

+0

你有没有试过检查zip内的pdf文件的大小?他们有一个尺寸?与原始文件相比,大小是多少?你也没有给我们addFolderToZip的代码。 – user254948 2014-11-24 15:51:08

+0

由于添加了单个文件,因此在这种情况下不使用addFolderToZip()。请记住。无论如何,你给我的想法是在下载文件后不要删除文件。可以看到PDF的尺寸比未压缩的大2MB。所以看起来一切正常,但下载无法启动。我有可以下载的大型视频文件,所以我很确定它不涉及任何内存限制。 HDD空间也很空(足够)。 – 2014-11-24 16:06:09

+0

只需要清楚:ZIP生成正确,可以运行并可以查看PDF。但是下载并不仅仅以特定的PDF开始。 – 2014-11-24 16:06:57

回答

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

希望这有助于。

+0

它导致相同的行为。如果我手动压缩,它会下载压缩文件,如果我通过zipArchive压缩,它会创建压缩文件,但不会下载..有些非确定性奇迹会在此处出现。 – 2016-03-15 08:59:48

+0

即使您的答案没有解决我的问题,通过在创建zip之后重定向到文件,使我重新设计了该过程。谢谢你的产品。 – 2016-03-16 08:21:02

+0

谢谢...让我知道你是否解决了你的问题...我看到你的问题已经更新。我会根据您的更新进一步调查并通知您。 – Ram 2016-03-16 11:28:35