2012-11-30 43 views
2

當我試圖打開它是由PHP Zip文件生成我的zip文件生成在Windows資源管理器無法打開zip文件,有證據顯示能否它通過PHP Zip文件

「Windows無法打開該文件夾警報。壓縮(壓縮)文件夾 「文件名」無效。「 Windows資源管理器中打開錯誤。

但我可以通過7-zip打開文件。出於某種原因,我必須確保Windows資源管理器可以打開zip文件。當我生成zip文件時是否有任何問題?請幫忙!

function create_a_zip($files = array(),$dest = '',$root_folder,$overwrite = false) { 
     if(file_exists($dest) && !$overwrite) { 
      return false; 
     } 
     $valid_files = array(); 
     if(is_array($files)) { 
      foreach($files as $file) { 
       if(file_exists($file)) { 
        $valid_files[] = $file; 
       } 
      } 
     } 

     if(count($valid_files)) { 
      $zip = new ZipArchive(); 
      if($zip->open($dest,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
       return false; 
      } 
      foreach($valid_files as $valid_file) { 
       if(is_dir($valid_file) === true){ 
        foreach(glob($valid_file . '/*') as $file){ 
         $zip->addFile($file, $root_folder . $file); 
        } 

       }else if (is_file($valid_file) === true){ 
        $zip->addFile($valid_file, $root_folder . $valid_file); 
       } 
      } 
      $zip->close(); 

      return file_exists($dest); 
     } 
     else 
     { 
      return false; 
     } 
    } 

回答

1

我覺得從這個問題來源:

$zip->addFile($file,$file); 

除非你有在同一目錄下你的PHP腳本,只要你想添加到壓縮文件,您將需要包括的文件路徑。 addFile中的第二個參數是zip內部文件的名稱,因此如果$ file var包含路徑,那麼問題可能來自哪裏。嘗試將代碼更改爲:

$filenameonly = preg_replace("/(.*)\/?([^\/]+)/","$2",$file); 
$zip->addFile($file,$filenameonly); 

將剝離出的文件路徑(如果有的話),讓你只有文件名中addFile第二個變量。

如果這能解決您的問題,您將確定知道問題出在您的文件名中,並且可以輕鬆找到它。

+0

感謝您的建議。但是,我只使用字母,數字,點(。)和下劃線(_)的路徑。所以路線上沒有空白。 – Ywis

+0

非英文字符怎麼樣? – Flot2011

+0

經過幾小時的追蹤代碼,最後我發現路徑名不是問題。在服務器上生成的zip文件是**正確**(可以通過Windows的內置Zip實用程序打開),而下載zip文件**不正確**!文件傳輸有問題嗎?我比較了他們的文件大小,他們完全一樣......無論如何,還是要感謝你的親切幫助! – Ywis

0

僅作爲參數發送到絕對路徑,例如$abspath。然後使用它在

$filenameonly = str_replace($abspath,"",$file); 
$zip->addFile($file, $filenameonly); 

即使在Windows 8甚至你的zip文件都在文件夾中它工作100%。

0

除了使用str_replace字符串函數外,還可以使用內置的文件系統函數。

$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME)); 
3

對我來說,解決辦法是輸出的zip文件的內容(如通過@Ywis在評論中指出的)前使用ob_end_clean() ...

ob_end_clean(); 
readfile($zipfilename); // outputs zip file's content 

...即使你不在此之前輸出任何字符。