假设我有一条 Sinatra 路线:
put '/data' do
request.body.read
# ...
end
看起来整个 request.body 都被读入内存了。有没有办法在主体进入系统时消耗它,而不是预先将其全部缓冲在 Rack/Sinatra 中?
我知道我可以这样做来读取部分正文,但整个正文似乎仍然被预先读入内存。
put '/data' do
while request.body.read(1024) != nil
# ...
end
# ...
end
最佳答案
如果不修补 Sinatra 和/或 Rack,通常无法避免这种情况。当 request.POST
时,由 Rack::Request
完成是 called by Sinatra创建params
.
但是您可以在 Sinatra 前面放置一个中间件来删除主体:
require 'sinatra'
require 'stringio'
use Rack::Config do |env|
if env['PATH_INFO'] == '/data' and env['REQUEST_METHOD'] == 'PUT'
env['rack.input'], env['data.input'] = StringIO.new, env['rack.input']
end
end
put '/data' do
while request.env['data.input'].body.read(1024) != nil
# ...
end
# ...
end
关于sinatra - 我可以让 Sinatra/Rack 不将整个请求正文读入内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027564/