有没有办法使用aws-sdk将大型文件上传到S3?
我似乎无法弄明白,但我认为有办法。 感谢
答案 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中解释了这一点:
上传对象
- 通过提供您的AWS凭据创建AWS :: S3类的实例。
- 使用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}."
应该很容易调整以使用流来代替(如果我没记错的话,您可能只需要用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。这可能是您需要的 - 在上传过程中释放您的服务器。