찾다

 >  Q&A  >  본문

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('콘텐츠 설명: 파일 전송'); header("콘텐츠 유형: 애플리케이션/옥텟 스트림"); header("콘텐츠 처리: 첨부 파일; 파일 이름=test.bin"); header("콘텐츠 길이: 파일 크기=" . strlen($bin)); header("캐시 제어: no-cache"); 에코 $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粉328911308516일 전548

모든 응답(1)나는 대답할 것이다

  • P粉966335669

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

    문제는 Content-Length 헤더가 설정되는 방식입니다. 원래 코드는 헤더를 설정합니다

    으아악

    다음과 같이 설정해야 합니다:

    으아악

    헤더의 추가 텍스트 "filesize="는 클라이언트의 응답 구문 분석을 혼란스럽게 할 뿐입니다. Content-Length가 8000보다 작거나 같으면 클라이언트가 복구할 수 있는 방법이 있을 수 있지만 Content-Length가 8001보다 크거나 같으면 상황을 처리할 수 없습니다

    회신하다
    0
  • 취소회신하다