1. 먼저 저의 사용 시나리오에 대해 말씀드리겠습니다. 즉, 클라이언트는 서버의 인터페이스를 사용하여 파일을 다운로드합니다. 서버측에서는 바이너리를 직접 얻어서 출력합니다. echo 바이너리 외에 더 합리적인 반환 방법이 있나요?
2. PHP 헤더('Content-Length: '.strlen($Download))를 사용하여 Content-Length를 설정하세요. 논리적으로 말하면 http 요청 자체는 출력 크기에 따라 Content-Length를 설정합니다. 설정을 변경하더라도 최종 요청된 Content-Length는 여전히 실제 크기를 기준으로 합니다.
3. 또 다른 문제는 10M 파일의 바이너리를 요청한다는 것입니다. 브라우저로 요청하면 Content-Length 헤더가 전혀 반환되지 않습니다. 클라이언트에서 요청할 때 Content-Length가 정상적으로 반환될 수 있습니다. Content-Length의 반환도 요청 방법과 관련이 있나요?
漂亮男人2017-05-16 13:00:51
소스가 바이너리 스트림인가요?
1. 파일인 경우 실제 경로를 숨기려면 다음 방법을 시도해 보세요.
readfile($filename)
이 echo
readfile($filename)
比echo
效率高
或者使用 X-SendFile
技术
如果的确是二进制流,也可以尝试先缓存成文件了 然后 X-SendFile
2, header
设置Content-Length
是有效的,返回真实的大小即可。这个在一些下载软件比较重要,比如迅雷。
它会检测最终大小是否符合Content-Length
3, 浏览器会以Content-Length
为参照,
但是当网络很糟糕的时候,超时、断流了,浏览器也会停止下载,最终得到的是一个不完整的文件,这个下载国外软件的时候很常见。
如果实际大小超过了Content-Length
,浏览器也接受。
4, 所以即使没有Content-Length
보다 더 효율적입니다.
X-SendFile
기술을 사용하세요🎜
🎜실제로 바이너리 스트림인 경우 먼저 파일에 캐시한 다음 X-SendFile
🎜을 시도해 볼 수도 있습니다.
🎜2, header
설정 Content-Length
가 유효합니다. 실제 크기를 반환하면 됩니다. 이는 Thunder와 같은 일부 다운로드 소프트웨어에서 더 중요합니다. Content-Length
🎜를 준수하는지 확인합니다.
🎜3. 브라우저는 Content-Length
를 참조로 사용하지만Content-Length
를 초과하는 경우 브라우저에서도 이를 허용합니다. 🎜
🎜4, 따라서 반환된 Content-Length
가 없더라도 브라우저는 계속 다운로드할 수 있습니다. 서버 연결이 끊어지면 브라우저는 다운로드를 종료합니다. 🎜