首页  >  问答  >  正文

PHP中使用echo输出大型二进制字符串到HTTP响应时,服务器返回了一个格式错误的响应

<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>
P粉328911308P粉328911308441 天前495

全部回复(1)我来回复

  • P粉966335669

    P粉9663356692023-08-29 09:05:32

    问题在于Content-Length头部的设置方式。原始代码设置了一个头部

    header("Content-Length: filesize=" . strlen($bin));

    应该像下面这样设置:

    header("Content-Length: " . strlen($bin));

    在头部中额外的文本"filesize="只会混乱客户端对响应的解析。当Content-Length小于等于8000时,客户端可能有办法恢复,但无法处理Content-Length大于等于8001的情况

    回复
    0
  • 取消回复