阅读Sinatra的身体流

我正在尝试使用带有Sinatra的PUT方法上传带有XHR请求的文件。 我的第一个想法是上传文件并将流直接写入MongoDB GridFS

@fs.open("test.iso", "w") do |f| f.write request.body.read end 

它可以工作,但是,它将整个文件加载到RAM中并将其写入MongoDB GridFS。 我想通过将其连续写入GridFS(流文件,不加载它并将其放入GridFS)而不将整个文件加载到RAM中来避免这种行为:因为对于大文件(如1GB或更多),它是显然是一种不好的做法(由于RAM的消耗)。

我怎样才能做到这一点 ?

编辑: 我可以让Sinatra / Rack不将整个请求体读入内存吗? 方法是创建一个TempFile,我想只使用流来优化服务器端的内存消耗。 就像php://input在PHP中一样。

编辑2:

以下是我目前正在处理它的方式:

  • HTML / JS部分
  • Ruby / Sinatra部分

看起来Sinatra中的流媒体支持只是向客户端长时间运行GET请求的相反方向。

如果你进行POST多部分上传,Sinatra会将数据写入临时文件,并在params Hash中提供详细信息。

 require 'sinatra' require 'fileutils' post '/upload' do tempfile = params['file'][:tempfile] filename = params['file'][:filename] FileUtils.mv(tempfile.path, "test.iso") "posted" end 

在同一个sinatra目录中:

 $ echo "testtest" > /tmp/file_to_upload $ curl --form "file=@/tmp/file_to_upload" http://localhost:4567/upload posted $ cat test.iso testtest