如何将机架文件直接上传到S3?

时间:2014-02-17 17:04:10

标签: ruby amazon-s3 rack

是否可以使用ruby管道文件上传?

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

Streaming data to S3 with ruby显示了如何流式传输到S3,但我不确定如何将机架应用中的请求主体转换为可读流。

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

2 个答案:

答案 0 :(得分: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)

这还没有经过生产或其他任何测试,但它应该可以正常工作。

答案 1 :(得分:1)

查看我的项目middl:https://github.com/diclophis/middl

它有一些警告......大多数情况下你必须依赖客户端发送一个适当的请求大小标题(w3规范不要求)