阅读Sinatra的身体流

时间:2014-07-11 14:07:00

标签: ruby 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的消耗)。

我该怎么做?

编辑: Can I have Sinatra / Rack not read the entire request body into memory?方法正在创建一个TempFile,我想只使用流来优化服务器端的内存消耗。 就像php://input在PHP中一样。

编辑2:

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

1 个答案:

答案 0 :(得分:0)

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

如果您进行POST分段上传,Sinatra会将数据写入临时文件,并在params哈希中为您提供详细信息。

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