使用 rust actix 发送响应时内容长度始终为 0

问题描述 投票:0回答:1

我正在使用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 rust
1个回答
0
投票

我认为您可能对 http 范围的工作原理有误解。

服务器无法“强制”客户端使用范围。它只能作为另一次转账的一部分通知客户。

无论如何,客户端都会开始转账。

案例 1:客户端请求一个范围

如果客户端已经包含

Range:
标头,那么您可以直接响应:

HTTP/2 206
content-length: <partial size>
accept-ranges: bytes
content-range: bytes <range>

案例 2:客户端请求一个不带范围的
GET

如果客户端包含

Range:
标头,您必须响应整个文件。别担心,您不需要将整个 >500MB 加载到 RAM 中,您只需打开一个文件流并告诉 actix 将该文件流式传输到连接即可。

您现在可以通过在响应中添加

Accept-Ranges
标头来进一步告知客户您也支持范围。这并不意味着您应该发送空响应,您仍然需要发送整个文件。但是,客户端可以取消下载并开始部分传输,如案例 1 案例 3:客户端请求一个不带范围的

HEADER

为了避免像

情况2

那样启动/停止/重新启动下载,客户端可以发送HEADER请求。这意味着服务器现在可以使用

Range:
响应标头进行响应,而无需发送数据。这是一种性能优化,可以由
CLIENT
触发,而不是服务器。服务器必须遵从客户端的请求,不能主动切换模式。客户必须这样做。 Actix 内置范围支持

但是,如果您只需要提供文件,请注意

NamedFile

 以及基于它的所有内容都已经支持范围,并且不需要显式实现。

© www.soinside.com 2019 - 2024. All rights reserved.