【问题标题】:How can I pipe a rack file upload directly to S3?如何通过管道将机架文件直接上传到 S3?
【发布时间】:2014-02-17 17:04:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ruby amazon-s3 rack


    【解决方案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)
    

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

    【讨论】:

      【解决方案2】:

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

      它有一些注意事项...大多数情况下您必须依靠客户端发送适当的请求大小标头(w3 规范不需要)

      【讨论】:

        猜你喜欢
        • 2012-04-11
        • 2020-11-14
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多