我尝试使用与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:
以下是我目前处理它的方式:
答案 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