1

我试图在将文件流式传输到客户端之前设置 Content-Length 标头。我将其设置为:

response.headers['Content-Length'] = "12341234"

然后我做类似的事情:

steam do |out|
   file_chunks.each do |chunk|
     out << chunk
   end
   out.close
end

但是,当我尝试在浏览器中下载文件时,Content-Length 标头为空白。有谁知道这是 Sinatra 问题还是乘客/Apache 问题?

我假设发生的事情是这个代码块之间的某个层,当实际发送响应时,它看到它首先发送标头并且数据块是空的,因此即使我明确设置它,它也假定内容长度为 0。

还有另一种方法可以告诉浏览器我发送的文件有多大?

编辑

看起来是乘客问题而不是 Sinatra 问题。如果我以薄的方式运行服务器,则 Content-Length 将正确传递。我猜如果已经设置了 Content-Length ,问题会更改为不更改?

4

2 回答 2

1

这里的问题是,当使用 Transfer-Encoding:chunked 时,Content-Length 标头被省略了。

见: http: //greenbytes.de/tech/webdav/rfc2616.html#rfc.section.4.4

于 2017-02-23T11:06:11.420 回答
0

这是一个 Sinatra 问题。它的流 API 仅支持基于 EventMachine 的服务器。也就是说,API 只支持 Thin。使用Passenger 时,您应该绕过Sinatra 流API,并且应该使用Phusion Passenger 支持的Rack 套接字劫持API直接流式传输HTTP 响应。这是一个示例,它演示了如何使用机架套接字劫持 API 在 Phusion 乘客上流式传输服务器发送的事件。

于 2014-01-14T18:51:45.153 回答