2014-01-11 87 views
3

我想使用此代碼下載一個.zip文件PHP Content-Length頭不工作

<?php 
    $file = "something.zip"; 
    $size = filesize($file); 
    header('Content-type: application/octet-stream'); 
    header("Content-length: $size"); 
    header('Content-Disposition: attachment; filename="downloaded.zip"'); 
    readfile($file); 
?> 

,但它似乎沒有工作,甚至當我嘗試將文件大小設置爲一個數字,如header("Content-length: 567247784");。我只得到一個沒有聲明大小的文件,或者一個像28字節這樣的小文件。

我看着this的問題,我想我和海報有同樣的問題,但他的解決方案是「有服務器問題」。我想我也有一個服務器配置問題,但他的答案根本沒有幫助我。

+0

在設置標題之前不要輸出任何內容。 – Musa

+0

哎呀,我試圖查看文件大小是否找到後,我忘記刪除它。儘管如此,它仍然不起作用。 – nicoco007

回答

9

它與mod_deflate阻礙相關。我花了一天的.htaccess搞亂,並試圖一百萬個不同的東西,到底這個固定它,但我真的不能解釋爲什麼:

header('Content-Length: '.$filesize); 
    header("Content-Range: 0-".($filesize-1)."/".$filesize); 

我想補充一點,我的PHP與小於256MB配置的記憶。

+0

Gaaah!我終於嘗試了你的方法,它完美的工作!非常感謝! – nicoco007

-1

也許在這個問題: header("Content-length:" . $size); 但我可能是錯的

+0

不,可悲的是,這並沒有改變任何東西... – nicoco007

0

嘗試刪除後?>在這樣的情況下。 ?>之後的換行符或空格可以改變結果。

通常,網絡服務器會自動設置Content-Length標題。

對於調試,您可以使用非常棒的http://fiddler2.com/來檢查標頭,甚至編寫任意請求來測試您的假設。如果內容正文與Content-Length標題不同,提琴手會發出警告。

+0

這似乎只給我更高的數字(約260字節,而不是約20)。我會嘗試使用Fiddler2。 Galerie! – nicoco007

0

我認爲最簡單,最好的辦法是:

$head = array_change_key_case(get_headers($file, TRUE)); 
        $filesize = $head['content-length']; 
-1

我有同樣的問題,在我的情況,當我在一些PHP文件中包括一個轉義字符之前<?php標籤有人解決。然後,由頁面返回的信息比在$size = filesize($file);中通知的更大,並且這導致錯誤。