Bei der Verwendung von echo zur Ausgabe einer großen Binärzeichenfolge in einer HTTP-Antwort in PHP gab der Server eine fehlerhafte Antwort zurück.
P粉328911308
2023-08-28 10:26:38
<p>Ich versuche, mit dem folgenden Code einige große Binärarrays in eine HTTP-Antwort auszugeben: </p>
<pre class="brush:php;toolbar:false;">$bin = NULL;
$strLenToOutput = 8000;
for ($i=0; $i < $strLenToOutput; $i++) {
$bin .= pack("C", 1);
}
header('Content-Description: Dateiübertragung');
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>Wenn die auszugebende Zeichenfolge relativ kurz ist, kleiner oder gleich 8000, funktioniert der obige Code einwandfrei. Aber wenn die Stringlänge auf 8001 erhöht wird, erhalte ich in Postman die folgende Fehlermeldung: </p>
<pre class="brush:php;toolbar:false;">Analysefehler: Der Server hat eine fehlerhafte Antwort zurückgegeben</pre>
<p>Ich verwende PHP7.4 auf Apache V2.4.46, alle Einstellungen sind Standard. </p>
<p>Was mache ich hier falsch? Müssen der PHP-Code oder einige Einstellungen auf Apache2 geändert werden? </p>
<p>Bitte geben Sie Hinweise, vielen Dank im Voraus. </p>
<p>Update: Wenn ich die folgende Zeile entferne, die die Dateilänge festlegt, funktioniert der PHP-Code einwandfrei. Ich schätze, das Problem ist, dass ich PHP diesen Teil selbst überlassen sollte. </p>
<pre class="brush:php;toolbar:false;">//header("Content-Length: filesize=" . strlen($bin));</pre></p>
问题在于Content-Length头部的设置方式。原始代码设置了一个头部
应该像下面这样设置:
在头部中额外的文本"filesize="只会混乱客户端对响应的解析。当Content-Length小于等于8000时,客户端可能有办法恢复,但无法处理Content-Length大于等于8001的情况