2012-11-23 56 views
3

我使用php ZipArchive快速創建一個zip文件並將其發回給用戶。我壓縮文件臨時存儲上述文檔根目錄文件夾中,然後先有後的代碼由PHP發送的ZIP歸檔文件已損壞

header('Content-type:application/zip'); 
header('Content-Disposition: inline; filename="'.("file.zip").'"'); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length:".filesize($file)); 
$fh = fopen($file,'rb'); 
fpassthru($fh); 

寄回發出了

$zip->close() 

,以確保該文件未打開。我遇到的問題是這個 - 存儲的zip文件是一個有效的存檔,我可以在Windows 7,7Zip,WinZIP等中打開。但是,當我使用上面的代碼向下發送文件時,它會以0xD 0xA對在文件開始時足以使其損壞。我無法弄清楚這些角色可能來自哪裏。這是一個已知的錯誤與fopen/fpassthru?任何幫助將非常感激。

+2

提示:有['readfile'] (http://php.net/readfile)直接輸出文件... – deceze

+1

是否加入'fclose($ fh);退出();'在最後的幫助? – Bart

+0

另外,你確定沒有其他輸出? PHP文件本身的BOM?任何空白? – deceze

回答

3

你的完整腳本是什麼樣的?

一般而言,您應該在腳本文件末尾刪除任何關閉的PHP標記,因爲它可能是腳本結尾或包含腳本的輸出。

+0

謝謝大衛的建議。我通常使用幾十個小腳本,在所有地方都需要並需要。我經歷了一大堆事情,一次一個地評論一個問題,並在這些腳本中的一個腳本中固定這個問題 - 不管它是否被終止?>之後的不必要的回車。 – DroidOS

+1

樂於幫助 - 最好省略?>,因爲它們在最後不需要! –

+0

@ karl-gjertsen答案也可以幫到 – Eduardo

9

我發現除去header("Content-Length:".filesize($file));線就修好了我同樣的問題...

+1

這對我有效。 –

+0

這也適用於我,但爲什麼?我有同樣的代碼工作幾個月之後突然停止,然後通過刪除代碼行它開始工作了! – idipous

1

多次嘗試後,當下載的zip文件,該解決方案是:

$result = create_zip($files_to_zip,$fileZip,true,$path_parts['dirname']); 
ob_clean(); 
ob_end_flush(); // more important function - (without - error corrupted 
zip) 
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header('Content-Type: application/zip;\n'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-Disposition: attachment; filename=\"".basename($fileZip)."\""); 
readfile($fileZip); 
unlink($fileZip); 
exit(); 
+0

ob_clean()和ob_end_flush()解決了這個問題,謝謝 – Eduardo