ホームページ  >  に質問  >  本文

PHP でエコーを使用して大きなバイナリ文字列を HTTP 応答に出力すると、サーバーは不正な形式の応答を返しました。

<p>次のコードを使用して、大きなバイナリ配列を HTTP 応答に出力しようとしています。</p> <pre class="brush:php;toolbar:false;">$bin = NULL; $strLenToOutput = 8000; for ($i=0; $i <$strLenToOutput; $i ) { $bin .= パック("C", 1); } header('コンテンツの説明: ファイル転送'); header("Content-Type: application/octet-stream"); header("Content-Disposition:attachment; filename=test.bin"); header("Content-Length: filesize=" .strlen($bin)); header("キャッシュ制御: キャッシュなし"); echo $bin;</pre> <p>出力される文字列が 8000 以下の比較的短い場合、上記のコードは正常に動作します。しかし、文字列の長さが 8001 まで増加すると、Postman で次のエラーが発生します。 </p> <pre class="brush:php;toolbar:false;">解析エラー: サーバーが不正な形式の応答を返しました</pre> <p>Apache V2.4.46 で PHP7.4 を実行しています。設定はすべてデフォルトです。 </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日前497

全員に返信(1)返信します

  • P粉966335669

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

    問題は、Content-Length ヘッダーの設定方法にあります。元のコードはヘッダーを設定します

    リーリー

    は次のように設定する必要があります:

    リーリー

    ヘッダー内の余分なテキスト「filesize=」は、クライアントによる応答の解析を混乱させるだけです。 Content-Length が 8000 以下の場合、クライアントには回復する方法がある可能性がありますが、Content-Length が 8001

    以上の場合は状況に対処できません。

    返事
    0
  • キャンセル返事