簡體   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