1.先說一下我這邊的使用場景。就是客戶端使用服務端的介面下載檔。服務端這邊是直接取得二進位然後輸出的。請問除了echo 二進制以外還有沒有更合理的返回方式。
2.用PHP header('Content-Length: '.strlen($Download));設定Content-Length,這個設定實際上無效的嗎?因為照理來說的話,本身http請求會根據輸出的大小來設定Content-Length。即使我設定改變了 最終請求的Content-Length還是根據實際的大小。
3.還有一個問題就是例如我請求一個 10M的檔案的二進位。用瀏覽器請求的話壓根沒有Content-Length這個頭回傳。用客戶端那邊請求能正常回傳Content-Length。 Content-Length的回傳請求的方式也有關係?
你的來源是二進位流?
1, 如果是文件,只是為了隱藏真實路徑,可以嘗試用以下方式:
readfile($filename)
比echo
效率高或使用
X-SendFile
技術如果的確是二進位流,也可以嘗試先快取成檔案了 然後
X-SendFile
2,
header
设置Content-Length
是有效的,返回真实的大小即可。这个在一些下载软件比较重要,比如迅雷。它会检测最终大小是否符合
Content-Length
3, 瀏覽器會以
Content-Length
为参照,但是当网络很糟糕的时候,超时、断流了,浏览器也会停止下载,最终得到的是一个不完整的文件,这个下载国外软件的时候很常见。
如果实际大小超过了
Content-Length
,瀏覽器也接受。4, 所以即使沒有
Content-Length
返回,瀏覽器也可以下載,等到服務端斷流,瀏覽器就終止下載。