2013-12-23 168 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