1.先說一下我這邊的使用場景。就是客戶端使用服務(wù)端的接口下載文件。服務(wù)端這邊是直接獲取二進(jìn)制然后輸出的。請問除了echo 二進(jìn)制以外還有沒有更合理的返回方式。
2.用PHP header('Content-Length: '.strlen($Download));設(shè)置Content-Length,這個(gè)設(shè)置實(shí)際上無效的嗎?因?yàn)檎绽韥碚f的話,本身http請求會根據(jù)輸出的大小來設(shè)置Content-Length。即使我設(shè)置改變了 最終請求的Content-Length還是根據(jù)實(shí)際的大小。
3.還有一個(gè)問題就是比如我請求一個(gè) 10M的文件的二進(jìn)制。用瀏覽器請求的話壓根沒有Content-Length這個(gè)頭返回。用客戶端那邊請求能正常返回Content-Length。Content-Length的返回跟請求的方式也有關(guān)系?
你的來源是二進(jìn)制流?
1, 如果是文件,只是為了隱藏真實(shí)路徑,可以嘗試用如下方式:
readfile($filename)
比echo
效率高
或者使用 X-SendFile
技術(shù)
如果的確是二進(jìn)制流,也可以嘗試先緩存成文件了 然后 X-SendFile
2, header
設(shè)置Content-Length
是有效的,返回真實(shí)的大小即可。這個(gè)在一些下載軟件比較重要,比如迅雷。
它會檢測最終大小是否符合Content-Length
3, 瀏覽器會以Content-Length
為參照,
但是當(dāng)網(wǎng)絡(luò)很糟糕的時(shí)候,超時(shí)、斷流了,瀏覽器也會停止下載,最終得到的是一個(gè)不完整的文件,這個(gè)下載國外軟件的時(shí)候很常見。
如果實(shí)際大小超過了Content-Length
,瀏覽器也接受。
4, 所以即使沒有Content-Length
返回,瀏覽器也可以下載,等到服務(wù)端斷流,瀏覽器就終止下載。