Sinatra上传流媒体

时间:2012-01-24 22:11:55

标签: ruby sinatra filestream

是否有可能让sinatra应用程序路由处理大文件上传通过POST与身体流如下:

uri  = URI('http://0.0.0.0:4567/files')
file = File.open("/path/to/1.iso")
req  = Net::HTTP::Post.new(uri.path)

req.content_type         = 'application/octet-stream'
req['Transfer-Encoding'] = 'chunked'
req.body_stream          = file

Net::HTTP.start(uri.hostname, uri.port) do |http|
  http.request(req)
end

这是针对网络服务的,目前,我无法看到如何处理这个问题,我试图将此请求发送到我的实际路线:

post '/file' do
   File.open('/path/to/downloaded.iso', 'ab') do |file|
     file << request.body.read
   end
end

但它明显失败了:

 `!! Unexpected error while processing request: closed stream`

也无法使用流媒体版本。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:3)

req['Transfer-Encoding']

不会强制Net :: HTTP使用分块编码进行上传,但只会让你的sinatra认为它是分块的。请参考this gist以实现分块上传。

Excon是一个很好的HTTP Ruby客户端,用于在this commit之后实现分块上传。