2013-11-23 235 views
6

我想從名爲「upload」的文件夾壓縮和下載文件。 Zip文件正在下載,但我無法打開(提取)它。 我收到一個錯誤,例如「檔案要麼處於未知格式,要麼已損壞」。使用php壓縮和下載文件

我發現下面的代碼壓縮文件夾。

<?php 
    $files = "upload/".array('Dear GP.docx','ecommerce.doc'); 
    $zipname = 'filename.zip'; 
    $zip = new ZipArchive; 
    $zip->open($zipname, ZipArchive::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 
    header('Content-Type: application/zip'); 
    header('Content-disposition: attachment; filename=filename.zip'); 
    header('Content-Length: ' . filesize($zipfilename)); 
    readfile($zipname); 
?> 
+0

這個問題可能與'$ files =「upload /」。array('Dear GP.docx','ecommerce.doc');'有關。嘗試顯示錯誤並檢查PHP錯誤。你正在試圖將一個數組作爲一個字符串。 –

回答

20

謝謝您的回答。

<?php 
    $files = array('Dear GP.docx','ecommerce.doc'); 

    # create new zip opbject 
    $zip = new ZipArchive(); 

    # create a temp file & open it 
    $tmp_file = tempnam('.',''); 
    $zip->open($tmp_file, ZipArchive::CREATE); 

    # loop through each file 
    foreach($files as $file){ 

     # download file 
     $download_file = file_get_contents($file); 

     #add it to the zip 
     $zip->addFromString(basename($file),$download_file); 

    } 

    # close zip 
    $zip->close(); 

    # send the file to the browser as a download 
    header('Content-disposition: attachment; filename=Resumes.zip'); 
    header('Content-type: application/zip'); 
    readfile($tmp_file); 
?> 
+0

這非常有用,謝謝! –

+0

謝謝!工作正常! –

+0

編輯出這個問題的部分問題。 [請僅使用Answers來回答問題](// meta.stackoverflow.com/q/92107)。如果您有新問題,請點擊[問問題](// stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 – Mogsdad

0

請使用下面的代碼代替$ zip-> addFile($ file);

<?php 
$zip->addFile($file_path, $filename); 
?> 
+0

這不是問題。 '$ filename'是[可選](http://www.php.net/manual/en/ziparchive.addfile.php)參數 –

+0

好的。我使用文件名創建zip文件,所以我建議文件路徑和文件名都選項。 –

0
$files = "upload/".array('Dear GP.docx','ecommerce.doc'); 

應該是:

$files = array('upload/Dear GP.docx','upload/ecommerce.doc'); 

如果您仍然有問題,那麼你應該檢查是否有寫權限到當前目錄。您可以檢查返回值close()以檢查文件是否實際寫入。

$res = $zip->close(); 
var_dump($res); 

如果寫入成功,輸出應爲bool(true)

看起來你在filesize()通話也有錯誤的變量名稱:

header('Content-Length: ' . filesize($zipfilename)); 

也許應該是:

header('Content-Length: ' . filesize($zipname)); 

您還可以添加額外的驗證,以檢查是否是文件實際上存在並且在發送之前檢查zip文件是否存在。

編輯:上顯示錯誤轉到幫助你在本地調試:

ini_set('display_errors', 1); 
error_reporting(E_ALL); 
2

我度過了這個下載的zip文件超過6小時在我的Mac(本地主機) - 儘管文件被下載得到,我無法對其進行解壓縮(獲得cpgz文件)。顯然,堆棧溢出中提到的解決方案(圍繞zip文件下載的各種問題)都沒有奏效。最後,在反覆試驗之後,我發現下面的代碼有效:

之前回答的人都沒有談及ob_start(),你應該把它放在哪裏。無論如何,這本身並不是答案 - 你需要使用ob_start()以上的那三行。

$file=$zippath.$filename; 
if (headers_sent()) { 
    echo 'HTTP header already sent'; 
} else { 
    if (!is_file($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 
     echo 'File not found'; 
    } else if (!is_readable($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); 
     echo 'File not readable'; 
    } else { 
     while (ob_get_level()) { 
      ob_end_clean(); 
     } 
     ob_start(); 
     header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
     header("Content-Type: application/zip"); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-Length: ".filesize($file)); 
     header('Pragma: no-cache'); 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
     ob_flush(); 
     ob_clean(); 
     readfile($file); 
     exit; 
    } 
} 
+0

就我所知(當然可能是錯誤的),ob_end_clean()與緩存有關,因爲大文件會被緩存搞亂。 – Skytiger

0

答案是好的,但請在標題前添加這些行。 ZIP文件中的所有壓縮軟件打開(Win​​zip或WinRar等)

if (headers_sent()) 
    { 
     // HTTP header has already been sent 
     return false; 
    } 
// clean buffer(s) 
while (ob_get_level() > 0) 
    { 
     ob_end_clean(); 
    } 
0
$zip = new ZipArchive; 
     if ($zip->open('assets/myzip.zip', ZipArchive::CREATE)) { 
      $zip->addFile('folder/bootstrap.js', 'bootstrap.js'); 
      $zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js'); 
      $zip->close(); 
      echo 'Archive created!'; 
      header('Content-disposition: attachment; filename=files.zip'); 
      header('Content-type: application/zip'); 
      readfile($tmp_file); 
     } else { 
      echo 'Failed!'; 
     } 

我得到這個代碼從文件夾中下載文件。