2011-12-12 29 views
1

看來我成功地創建一個對即時ZIP檔案(文件大小和file_exists都返回預期值),但是當我嘗試實際下載它,我收到一個空的ZIP文件。奇怪的是,這個錯誤同時發生在readfile和fread上。這是我的代碼PHP的飛行ZIP下載空白

$filename = $zip; 
    $handle = fopen($filename, 'r'); 
    if ($handle === false) 
    { 
     die('Could not read file "' . $filename . '"'); 
    } 

    header('Content-type: application/zip'); 
    header('Content-Disposition: attachment; filename="fsdownload.zip"'); 
    header('Cache-Control: private'); 
    while (!feof($handle)) 
    { 
     echo fread($handle, 8192); 
    } 
    fclose($handle); 

這適用於zip文件< 10 MB。任何想法可能是什麼問題?

+0

是什麼PHP錯誤日誌不得不說一下嗎? – Nameless

+0

給fpassthru一個去。還需要多長時間才能下載? – Sam

回答

1

爲了避免消耗太多內存,您可以使用ZipStreamPHPZip,它將隨時將壓縮文件發送到瀏覽器,並以塊分割,而不是將整個內容加載到PHP中,然後發送zip文件。

這兩個庫都是很好用的代碼段。有幾個細節:

  • ZipStream「作品」只有記憶,但不能很容易地移植到PHP 4(如有必要,使用hash_file()
  • PHPZip在磁盤上寫入臨時文件(佔用的磁盤空間作爲最大文件添加到zip中),但如果需要,可以輕鬆適應PHP 4。

相關SO問題:

0

問題是PHP限制。檢查內存和執行時間限制。

+0

可疑,該文件沒有被讀入內存 – Sam

+0

這取決於PHP版本。見http://www.php.net/manual/de/function.fread.php#73887 – PiTheNumber