我尝试在将文件流式传输到客户端之前设置Content-Length标头。我设置它:
response.headers['Content-Length'] = "12341234"
然后我做了类似的事情:
steam do |out|
file_chunks.each do |chunk|
out << chunk
end
out.close
end
但是,当我尝试在浏览器中关闭文件时,Content-Length标头为空。有谁知道这是Sinatra问题还是Passenger / Apache问题?
我假设发生的事情是这个代码块之间的某个层,当响应实际发送时,它看到它首先发送头并且数据块是空的,所以它假设内容长度为0,即使我设置它明确。
还有另一种方法可以告诉浏览器我发送的文件有多大吗?
修改
看起来是乘客问题而不是Sinatra问题。如果我使用thin运行服务器,则正确传递Content-Length。我想这个问题会改变,如果已经设置了Content-Length会不会改变它?
答案 0 :(得分:0)
这是一个Sinatra问题。其流API仅支持基于EventMachine的服务器。换句话说,API仅支持Thin。使用Passenger时,您应该绕过Sinatra流API,并且应该使用Phusion Passenger支持的the Rack socket hijacking API直接传输HTTP响应。 Here is an example演示如何使用机架套接字劫持API在Phusion Passenger上流式传输服务器发送事件。
答案 1 :(得分:0)
这里的问题是当使用Transfer-Encoding:chunked时,省略Content-Length标头。
请参阅:http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.4.4