【问题标题】:Stream uploading large files using aws-sdk使用 aws-sdk 流式上传大文件
【发布时间】:2012-03-24 06:48:14
【问题描述】:

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

我似乎无法弄清楚,但我假设有办法。 谢谢

【问题讨论】:

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


    【解决方案1】:

    更新

    正如(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中有解释:

    上传对象

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

    这应该很容易调整为使用流(如果我没记错的话,您可能只需将 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}."
    

    【讨论】:

    • 几分钟后失败,“字符串包含空字节”gist.github.com/1990541
    • @99miles:我的记忆确实让我失望了,我已经相应地更新了我对 AWS 示例的错误解释的答案 - 请注意,我还没有实际测试过,所以要小心 ;)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2013-06-22
      • 2018-02-25
      • 1970-01-01
      • 2013-11-14
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多