2014-02-17 92 views
1

是否可以使用ruby管道上传文件?如何将机架文件直接上传到S3?

而不是将整个文件读入内存,或写入临时文件然后写入S3,我希望直接流式传输请求主体。

Streaming data to S3 with ruby显示如何流到S3,但我不知道如何将机架应用程序中的请求主体转换为可读流。

class FastUploadApp 
    def self.call(env) 
    # what goes here? 
    end 
end 

回答

1

你是完全正确的,你需要将请求正文变成可读的流。具体来说,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) 

这并没有在生产中测试或任何东西,但它应该工作正常。

+0

巨大的!我将在接下来的几天内为此工作 – AJcodez