使用aws-sdk流上传大文件

99m*_*les 3 ruby ruby-on-rails amazon-s3 amazon-web-services ruby-on-rails-3

有没有办法使用aws-sdk流式传输大型文件到S3?

我似乎无法弄清楚,但我假设有一种方法.谢谢

Ste*_*pel 6

更新

我的记忆失败了,我没有正确阅读初始答案中提到的引用(见下文),正如(S3Object,ObjectVersion)写的API文档(data,options = {})所揭示的那样:

在S3中将数据写入对象.此方法将尝试在一个请求中上载和使用#multipart_upload之间进行智能选择.

[...]您可以传递:data或:file作为第一个参数或作为选项.[强调我的]

data参数是用于流式传输的参数,显然:

:data (Object) - 要上传的数据.有效值包括:

[...] 任何响应read和eof的对象?; 该对象必须支持以下访问方法:

read                     # all at once
read(length) until eof?  # in chunks
Run Code Online (Sandbox Code Playgroud)

如果以这种方式指定数据,则还必须包含:content_length选项.

[...]

:content_length (Integer) - 如果提供,此选项必须与操作期间写入S3的总字节数相匹配.如果出现以下情况,则此选项是必需的:data是类似IO的对象,没有size方法.

[强调我的]

生成的样本片段可能如此相应:

# Upload a file.
key = File.basename(file_name)
s3.buckets[bucket_name].objects[key].write(:data => File.open(file_name), 
    :content_length => File.size(file_name))
puts "Uploading file #{file_name} to bucket #{bucket_name}."
Run Code Online (Sandbox Code Playgroud)

请注意,我还没有真正测试过这个,所以要小心;)


初步答复

使用AWS SDK for Ruby上传对象时解释了这一点:

上传对象

  1. 通过提供AWS凭据创建AWS :: S3类的实例.
  2. 使用AWS :: S3 :: S3Object#write方法,该方法采用数据参数和选项哈希,允许您从文件或流上传数据.[强调我的]

该页面还包含一个完整的示例,它使用的是文件而不是流,相关的片段:

# Upload a file.
key = File.basename(file_name)
s3.buckets[bucket_name].objects[key].write(:file => file_name)
puts "Uploading file #{file_name} to bucket #{bucket_name}."
Run Code Online (Sandbox Code Playgroud)

这应该很容易调整以使用流(如果我没记错的话,你可能只需要用 - 替换file_name参数open(file_name)来确保验证这一点),例如:

# Upload a file.
key = File.basename(file_name)
s3.buckets[bucket_name].objects[key].write(:file => open(file_name))
puts "Uploading file #{file_name} to bucket #{bucket_name}."
Run Code Online (Sandbox Code Playgroud)