是否有可能让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`
也无法使用流媒体版本。
非常感谢任何帮助,谢谢。
答案 0 :(得分:3)
req['Transfer-Encoding']
不会强制Net :: HTTP使用分块编码进行上传,但只会让你的sinatra认为它是分块的。请参考this gist以实现分块上传。
Excon是一个很好的HTTP Ruby客户端,用于在this commit之后实现分块上传。