2013-12-23 193 views
1

我已經實現了創建Zip文件夾(從數據庫路徑)並下載PHP中的壓縮文件夾的代碼。我正在使用Ubuntu操作系統。在PHP中不下載Zip文件

public function actionDownload($id) { 
      $model = $this->loadModel($id, 'Document'); 
      $results = array(); 
      $results = $this->createZip($model); 

      $zip = $results[0]; 
      $size = filesize($zip->filename); 

      if ($zip->filename) {    
       header("Content-Description: File Transfer"); 
       header("Content-type: application/zip"); 
       header("Content-Disposition: attachment; filename=\"" . $model->name . "\""); 
       header("Content-Transfer-Encoding: binary"); 
       header("Content-Length: " . $size); 

       ob_end_flush(); 
       flush(); 
       readfile($zip->filename); 
       // To Store User Transaction Data 
       //$this->saveTransaction(); 
       //ignore_user_abort(true); 
       unlink($zip->filename); 
       $zip->close(); 

       // Delete newly created files 
       foreach ($results[1] as $fl) { 
        unlink($fl); 
       } 
      }  
    } 


public function createZip($model) { 

     $data = Document::model()->findAll('parent_folder=:id', array(':id' => (int) $model->document_id)); 
     $fileArr = array(); 
     foreach ($data as $type) { 
      $fileArr[] = $type->path; 
     } 

     $filestozip = $fileArr; // FILES ARRAY TO ZIP 
     $path = Yii::app()->basePath . DS . 'uploads' . DS . Yii::app()->user->id; 

     //$model->path = trim(DS . $path . DS); // DIR NAME TO MOVE THE ZIPPED FILES   

     $zip = new ZipArchive(); 
     $files = $filestozip; 
     $zipName = "USR_" . Yii::app()->user->id . "_" . $model->name . "_" . date("Y-m-d") . ".zip"; 

     $fizip = $path . DS . $zipName; 
     if ($zip->open($fizip, ZipArchive::CREATE) === TRUE) { 
      foreach ($files as $fl) { 
       if (file_exists($fl)) { 
        $zip->addFile($fl, basename($fl)) or die("<p class='warning'>ERROR: Could not add file: " . $fl . "</p>"); 
       } 
      } 
     } 

     $resultArr = array(); 
     $resultArr[] = $zip; 
     $resultArr[] = $files; 

     return $resultArr; 
    } 

zip創建代碼,做工精細和創建壓縮文件存在,但問題是該文件的所有者是www數據和文件權限是只讀

當我試圖設置chmod($zip->filename, 0777)權限該壓縮文件夾然後它顯示一個錯誤?

Error 500 
chmod(): No such file or directory 

實際上文件存在那裏。

如果我想沒有chmod()那麼它顯示我的錯誤

Error 500 
filesize(): stat failed for /home/demo.user/myapp/public_html/backend/uploads/1/USR_1_kj_2013-12-23.zip 

,然後它不是下載的zip文件。

這真是我正面臨的奇怪問題。這似乎是zip文件的一些權限問題,這就是爲什麼filesize()無法對該文件執行任何操作,但奇怪的是chmod()也無法正常工作。

需要此幫助。

感謝

回答

0

如果www-data具有讀取權限,文件權限設置是否正確。不需要chmod

您需要先撥$zip->close()才能下載,因爲只有在$zip->close()的文件纔會寫入磁盤。除非將文件寫入磁盤,否則readfile()將不起作用。


一個更聰明的方式,可以在內存中創建歸檔僅使用php://memory流包裝。但是,如果您只需要一次下載的檔案,這只是一個選項。

+0

文件夾已經具有讀寫權限,但是當PHP在該文件夾中創建zip文件時,它沒有讀寫權限 – Sky

+0

您添加了'$ zip-> close'嗎?它是否返回'true'? – hek2mgl

+0

是的$ zip-> close()正在返回空白頁,如果我在下載之前使用它 – Sky