2014-11-24 67 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