使用aws-sdk流上传大文件

时间:2012-03-06 18:26:43

标签: ruby-on-rails ruby ruby-on-rails-3 amazon-s3 amazon-web-services

有没有办法使用aws-sdk将大型文件上传到S3?

我似乎无法弄明白,但我认为有办法。 感谢

2 个答案:

答案 0 :(得分:6)

更新

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

  

在S3中将数据写入对象。这种方法将尝试   智能地选择在一个请求中上传和使用   #multipart_upload。

     

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

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

  

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

     

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

read                     # all at once
read(length) until eof?  # in chunks
     

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

     

[...]

     

:content_length (Integer) - 如果提供,此选项必须与。匹配   操作期间写入S3的总字节数。 此选项   如果:data是类似IO的对象而没有大小方法,则是必需的。

     

[强调我的]

结果样本片段可能如此相应:

# 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}."

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


初步答复

Upload an Object Using the AWS SDK for Ruby中解释了这一点:

  

上传对象

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

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

# 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}."

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

# 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}."

答案 1 :(得分:0)

我不知道您要上传的文件有多大,但对于大型文件,“预签名帖子”允许操作浏览器的用户绕过您的服务器并直接上传到S3。这可能是您需要的 - 在上传过程中释放您的服务器。