2013-02-09 79 views
6

我得到的zip文件下面的代碼沒有任何錯誤下載,但下載的zip文件是空的或損壞的,大小總是大約200字節。 即我無法打開該zip文件。 也ZipArchive :: getStatusString()也呈現出 「沒有錯誤」通過ZipArchive獲取損壞的或空的zip php

代碼:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
+0

它給我的錯誤。這意味着$ zipname目錄不會被創建。 但m沒有得到味精的「籃子裏沒有東西」,而是得到一個zip文件下載。 – 2013-02-09 22:23:46

回答

3

這是我最好的猜測。這裏出了什麼問題,在您的數組$files中,您存儲的值可能不是文件的實際路徑。

請記住:您無法將URL傳遞到$zip->addfile(),您需要實際的文件。

5

之前$zip->close();

$filename = $zip->filename; 

與應用嘗試獲取完整的文件路徑和名稱而不是$zipname當閱讀文件和獲取文件大小

+0

@Pony檢查這也..仍然有同樣的問題。 我認爲該文件的目錄沒有被創建。 另外我檢查'var_dump($文件名)'顯示確切的路徑。 – 2013-02-10 11:34:09

+0

您是否在調用'$ zip-> close()'之前分配了這個變量? – 2013-02-10 11:54:00

+0

工作就像一個魅力!謝謝 :) – Scott 2013-03-07 20:17:10

0

即使艱難這個問題已經想通了,我會後我發現了什麼拉鍊損壞如何可以創建:

當製作ZIP檔案,你會經常與回聲/ print_r的命令進行調試。如果你不清除這些,輸出的zip文件將被損壞。

例如基於這樣一個問題:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { 
     // to fix your corrupt zip file, remove this line. 
     echo 'THIS IS AN EXAMPLE DEBUG: ' . $zipname; 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
1

添加到即使因爲我只花了幾個小時,類似的問題原來的問題已經解決了這個線索。

事實證明,在執行$ zip-> close()時,無論何時使用$ zip-> addFile()添加它們,都需要存在這些文件。

因此,如果您創建臨時文件,將它們添加到您的zip文件中,然後在使用close()之前刪除它們,則最終可能會有空的/損壞的存檔。

0

我通過將代碼移動到我想要添加到Zip存檔的文件所在的文件夾中解決了同樣的問題。