2015-11-25 51 views
2

我們正在承載一些在我們的某個網站上作爲免費下載廣告的重型文件。這些文件在另一臺服務器上,以便以生成下載我們執行這個代碼:ZIP下載的尺寸比使用PHP標頭的外部服務器上的實際尺寸更大

header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Type:application/octet-stream"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Disposition:attachment;filename='$fileName'"); 
readfile("http://mysiste.com/downloads/$fileName"); 

哪裏$fileName是zip文件的名稱。例如:myfile.zip 所有工作正常,但如果myfile.zip是8Mb的服務器上它將下載爲16Mb!最瘋狂的事情是,文件工作正常,當解壓文件裏面的所有文件是完整的,沒有損壞。

我想它與標題和傳輸編碼有關,就好像壓縮文件沒有壓縮一樣。

任何想法?

+0

請讓我知道,如果你還需要進一步的幫助! – SyntaX

回答

2

我想你錯過了一個重要的標題 header("Content-length: $size")在這裏。您可以使用int filesize (string $filename)來查找文件大小。這裏是API doc

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

如果該文件位於遠程服務器上,你可以很容易地通過設置Curl沒有實際下載它得到Content-length。 這些計算器線程可以幫助你:

參考信用:Content-length and other HTTP headers?

這是將結合捲曲和PHP頭代碼:

$url="http://mysite/downloads/$fileName"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); // make it a HEAD request 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
$head = curl_exec($ch); 

$mimeType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
$path = parse_url($url, PHP_URL_PATH); 
$filename = substr($url, strrpos($path, '/') + 1); 

curl_close($ch); 

header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Type:$mimeType"); 
header("Content-Disposition:attachment;filename='$fileName'"); 
header('Content-Length: '.$size); 
readfile($url); 

我希望這有助於!

+0

問題是,該文件是從服務器的外部,我不認爲我可以讀取這樣的大小。另一個問題,爲什麼如果我不指定文件的大小最終變大? – multimediaxp

+1

我已經更新了答案,希望能夠解決您的問題。請查看鏈接。使用'curl'應該可以解決你的問題! – SyntaX

+0

非常感謝,我修改了你的答案並添加了解決問題的最終代碼。非常感謝! – multimediaxp