在Sinatra阅读正文流 [英] Reading body stream in Sinatra

查看:20
本文介绍了在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中:因为对于大文件(如1 GB或更大)而言,这显然是一种糟糕的做法(由于RAM消耗)。

我如何才能做到这一点?

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

编辑2:

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

推荐答案

看起来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

这篇关于在Sinatra阅读正文流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆