繁体   English   中英

如何将通过机架上传的文件直接传送到S3?

[英]How can I pipe a rack file upload directly to S3?

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

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

使用ruby将数据流传输到S3显示了如何将数据流传输到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规范不需要)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM