【发布时间】:2012-03-24 06:48:14
【问题描述】:
有没有办法使用 aws-sdk 将大文件流式上传到 S3?
我似乎无法弄清楚,但我假设有办法。 谢谢
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 amazon-s3 amazon-web-services
有没有办法使用 aws-sdk 将大文件流式上传到 S3?
我似乎无法弄清楚,但我假设有办法。 谢谢
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 amazon-s3 amazon-web-services
正如(S3Object, ObjectVersion) write(data, options = {}) 的 API 文档所揭示的那样,我没有正确阅读最初答案中提到的引述(见下文):
将数据写入 S3 中的对象。此方法将尝试 在一个请求中上传和使用之间智能地选择 #multipart_upload。
[...] 您可以将 :data 或 :file 作为第一个参数或选项传递。 [强调我的]
data 参数显然是用于流式传输的参数:
:data (Object)— 要上传的数据。有效值包括:[...] 任何响应读取和 eof 的对象?;该对象必须支持以下访问方法:
read # all at once read(length) until eof? # in chunks如果您以这种方式指定数据,您还必须包括 :content_length 选项。
[...]
:content_length (Integer)— 如果提供,此选项必须与 操作期间写入 S3 的总字节数。 此选项 如果 :data 是没有 size 方法的类似 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) - 请务必验证这一点),例如:
# 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}."
【讨论】:
我不知道您要上传的文件有多大,但对于大文件,“预签名帖子”允许操作浏览器的用户绕过您的服务器并直接上传到 S3。这可能是您需要的 - 在上传期间释放您的服务器。
【讨论】: