我正在使用react pdf 9.1.0在浏览器中显示pdf,现在我想让react pdf支持部分下载。服务器端使用的是openresty,我阅读了pdf.js手册,告诉我让服务器端添加部分下载。然后我添加服务器端 rust actix 代码,如下所示:
// tell the client support slice loading
return HttpResponse::PartialContent()
.insert_header(CacheControl(vec![CacheDirective::NoCache]))
.append_header(("Accept-Ranges", "bytes"))
.append_header((
"Access-Control-Expose-Headers",
"Accept-Ranges,Content-Range",
))
.append_header(("Content-Encoding", "identity"))
.append_header(("Content-Length", content_length))
.content_type("application/pdf")
.body("");
但是现在我发现即使我设置了长度,响应内容长度始终为0。为什么会发生这种情况?我应该怎么做才能解决这个问题?我已经检查了变量
content_length
并确保内容长度大于0。我应该将内容放入body中吗?现在我只想告诉客户端,如果文件很大(> 500MB),服务器支持部分内容加载。将内容放入正文并没有减少网络传输。传输整个文件没有区别。
我认为您可能对 http 范围的工作原理有误解。
服务器无法“强制”客户端使用范围。它只能作为另一次转账的一部分通知客户。
无论如何,客户端都会开始转账。
如果客户端已经包含
Range:
标头,那么您可以直接响应:
HTTP/2 206
content-length: <partial size>
accept-ranges: bytes
content-range: bytes <range>
GET
如果客户端不包含
Range:
标头,您必须响应整个文件。别担心,您不需要将整个 >500MB 加载到 RAM 中,您只需打开一个文件流并告诉 actix 将该文件流式传输到连接即可。
您现在可以通过在响应中添加
Accept-Ranges
标头来进一步告知客户您也支持范围。这并不意味着您应该发送空响应,您仍然需要发送整个文件。但是,客户端可以取消下载并开始部分传输,如案例 1。
案例 3:客户端请求一个不带范围的 HEADER
那样启动/停止/重新启动下载,客户端可以发送HEADER
请求。这意味着服务器现在可以使用
Range:
响应标头进行响应,而无需发送数据。这是一种性能优化,可以由CLIENT触发,而不是服务器。服务器必须遵从客户端的请求,不能主动切换模式。客户必须这样做。 Actix 内置范围支持
以及基于它的所有内容都已经支持范围,并且不需要显式实现。