PHP中使用echo輸出大型二進位字串到HTTP回應時,伺服器傳回了一個格式錯誤的回應
P粉328911308
2023-08-28 10:26:38
<p>我正在嘗試使用以下程式碼將一些大型二進位陣列輸出到HTTP回應:</p>
<pre class="brush:php;toolbar:false;">$bin = NULL;
$strLenToOutput = 8000;
for ($i=0; $i < $strLenToOutput; $i ) {
$bin .= pack("C", 1);
}
header('Content-Description: File Transfer');
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=test.bin");
header("Content-Length: filesize=" . strlen($bin));
header("Cache-Control: no-cache");
echo $bin;</pre>
<p>當要輸出的字串相對較短時,小於等於8000,上述程式碼運作正常。但是如果字串長度增加到8001,我會在Postman中收到以下錯誤:</p>
<pre class="brush:php;toolbar:false;">Parse Error: The server returned a malformed response</pre>
<p>我正在運行PHP7.4在Apache V2.4.46上,所有設定都是預設的。 </p>
<p>我在這裡做錯了什麼?是PHP程式碼還是Apache2上的一些設定需要更改? </p>
<p>請給予指導,提前感謝。 </p>
<p>更新:如果我刪除設定檔長度的以下行,PHP程式碼將正常運作。我猜問題是我應該讓PHP自己處理這部分。 </p>
<pre class="brush:php;toolbar:false;">//header("Content-Length: filesize=" . strlen($bin));</pre></p>
問題在於Content-Length頭部的設定方式。原始程式碼設定了一個頭部
應該要像下面這樣設定:
在頭部中額外的文字"filesize="只會混亂客戶端對回應的解析。當Content-Length小於等於8000時,客戶端可能有辦法恢復,但無法處理Content-Length大於等於8001的情況