是否可以使用ruby管道上传文件?如何将机架文件直接上传到S3?
而不是将整个文件读入内存,或写入临时文件然后写入S3,我希望直接流式传输请求主体。
Streaming data to S3 with ruby显示如何流到S3,但我不知道如何将机架应用程序中的请求主体转换为可读流。
class FastUploadApp
def self.call(env)
# what goes here?
end
end
是否可以使用ruby管道上传文件?如何将机架文件直接上传到S3?
而不是将整个文件读入内存,或写入临时文件然后写入S3,我希望直接流式传输请求主体。
Streaming data to S3 with ruby显示如何流到S3,但我不知道如何将机架应用程序中的请求主体转换为可读流。
class FastUploadApp
def self.call(env)
# what goes here?
end
end
你是完全正确的,你需要将请求正文变成可读的流。具体来说,S3需要一个Ruby IO类(因为它需要一个#read方法和一个#eof方法)。机架请求主体没有#eof?定义,然而,你必须做出一个小包装类:
class RackS3Wrapper
def initialize(body)
@body = body
@eof = false
end
def read(*args)
ret = @body.read(*args)
if ret == nil or ret == ""
@eof = true
end
ret
end
def eof?
@eof
end
end
然后你可以使用此包装以流直接请求S3:
s3.buckets['com.mydomain.mybucket'].objects['filename'].write(
:data => RackS3Wrapper.new(request.body),
:content_length => request.env['CONTENT_LENGTH'].to_i)
这并没有在生产中测试或任何东西,但它应该工作正常。
看看我的项目middl:https://github.com/diclophis/middl
它有一些注意事项...主要是你必须依赖客户端发送一个适当的请求大小的头(这不是由W3规范所要求的)
巨大的!我将在接下来的几天内为此工作 – AJcodez