研究和嘗試了很多的測試&試驗後,我發現關於header()
功能和readfile()
或相似的人的一些事實。
首先您應該知道header()
與不同瀏覽器存在兼容性問題。所以不要試圖尋找完美無瑕的功能。這個問題不是PHP功能,它是瀏覽器有不同的方式分析下載頭,所以他們都表現不同。你可能已經知道,最大的麻煩製造者是IE
如果要解決這個問題,並使其工作使用header()
,你必須添加/迫使一些標題詳細信息(Content-Type
,等等),但是,這是不可能在你的php代碼中。無論你嘗試了多少次,它都不起作用。我對此沒有太多的信息,但是我只知道即使在實際的header()
之前添加Content-Type
標題,它也不起作用。看起來他們完全是出於不同的目的。
您可以使用添加必要的報頭,並使用readfile()
函數,然後它會正常工作。但是你應該知道這個函數會加載/讀取你調用的內存中的文件/ url。這可能是一個很大的問題,可能會讓你的網絡服務器變慢,最糟糕的情況是它也可能崩潰。如果您的下載器或許多文件太多,就會發生這種情況。
不幸的是,正如我前面提到的,你不能在你的php代碼中修復這個問題。所以我爲了解決這個問題所做的是在我的webserver vhost中添加了頭文件。
NGINX:
location ~ ^/.*\.mp3$ {
add_header Pragma "public";
add_header Expires "0";
add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
add_header Content-Disposition "attachment";
add_header Content-Type "application/force-download";
add_header Content-Type "application/octet-stream";
add_header Content-Type "application/download";
add_header Content-Transfer-Encoding "binary";
}
在我的情況下,該文件的用戶必須下載爲MP3格式。但是你可以改變它或者設置一個全局指令,這樣它就可以使用任何格式。
只有失敗了會前的數據已經輸出等標題是爲時已晚的原因。 – BugFinder
確保你在'header'之後有'exit'。 –
@AleksG我用完整的代碼更新了帖子。你可以看到'header'沒有回顯或打印。 – xperator