代码之家  ›  专栏  ›  技术社区  ›  AJcodez

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

  •  1
  • AJcodez  · 技术社区  · 11 年前

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

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

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

    class FastUploadApp
      def self.call(env)
        # what goes here?
      end
    end
    
    2 回复  |  直到 11 年前
        1
  •  1
  •   AJcodez    11 年前

    您需要将请求体转换为可读流,这一点非常正确。具体来说,S3需要一个RubyIO类(因为它需要一个#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
  •  1
  •   diclophis    11 年前

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

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