【问题标题】:Large AWS uploads failing after random amount of time大量 AWS 上传在随机时间后失败
【发布时间】:2016-01-15 19:17:30
【问题描述】:

使用 Rails,我遵循 this Heroku article 允许将文件直接上传到 S3 存储桶。我实际上关注了这篇文章,因为我之前的实现不适用于分段上传(因此,大文件)。一旦我实现了这个方法大文件上传就好了,除了真的大文件。

我应该注意到我偏离了这篇文章,因为我使用的是 aws gem 的 v1,因为我们的 Rails 版本。

这就是我的设置:

S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET_NAME']]

def set_s3_post_url
  @s3_media_post_url = S3_BUCKET.presigned_post(key: "product_media/#{SecureRandom.uuid}-${filename}", success_action_status: '201', acl: 'public-read')
end

如前所述,这适用于大文件(~1GB),但是当我尝试上传一个文件时,比如 10GB,它会进入大部分上传状态,然后随机失败。有时 20 分钟后,有时 1 小时后。我认为签名的 URL 可能会过期,所以我明确地使用 expires: Time.now + 4.hours 设置了较长的过期时间,但这似乎不起作用。

如果有人对此有任何想法,我将非常感谢您的帮助!

更新

我尝试了@bbozo 使用maxChunkSize 的答案,但不幸的是,这似乎没有做到。但是,当我在控制台中查看 XHR 请求时,失败的请求从 AWS 返回了以下 XML 响应:

<Error>
    <Code>InternalError</Code>
    <Message>We encountered an internal error. Please try again.</Message>
    <RequestId>1231BD4A29EE5291</RequestId>
    <HostId>f5muQPj2lT2Tmqi49ffqjT4ueLimYvrWUJL6WRW+F7vgm2rL1+FOD3pmsKOEYxFaSFXzLiEZjTg=</HostId>
</Error>

【问题讨论】:

  • 你能提供更多关于它究竟是如何失败的信息吗?

标签: ruby-on-rails-3 jquery-file-upload aws-sdk blueimp jquery-fileupload-rails


【解决方案1】:

A计划

您是否正确配置了分块上传?

https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads

Heroku 文章没有提及在处理文件上传的the jquery plugin 中设置分块上传,

FAQ 说:

使用 jQuery File Upload 可以上传最大 4 GB 的文件 插入。通过使用分块文件上传(块更小 大于 4GB),潜在的文件大小是无限的。 4的限制 GB是由于某些浏览器限制,将来可能会修复 这些浏览器的更新

分块上传的文档是here,你应该定义一个maxChunkSize 属性来定义块的大小

$('#fileupload').fileupload({
    maxChunkSize: 10000000 // 10 MB
});

B计划

您可以建立一个简约的 node.js 实例,该实例接受文件上传并通过 AWS 开发工具包将其转发到 S3。

您也可以在免费的 heroku 实例上运行它,因为它可能每天可以睡 6 小时,而且我在以这种方式托管文件上传服务方面有很好的经验

【讨论】:

  • 嘿@bbozo!感谢您的建议。我试了一下并更新了我上面的问题。
  • Np :) 是所有 XHR 请求都失败了还是其中一个失败了?
  • 哎呀错过了这个。只是最后一个(上面发布的响应 XML)。仍然无法弄清楚:(虽然我不能接受答案,但你会得到我即将到期的赏金积分。谢谢!
  • @JodyHeavener 你最后运气好吗? :)
  • 不。仍在积极寻找答案。用blueimp 标记这个Q,希望能引起他们的注意。如果你还有什么我都听好了! :)
【解决方案2】:

如果您使用 heroku + s3 文件上传,我建议使用 gem 's3_direct_upload'。使用它,您可以将文件上传到 AWS::S3,而无需连接到 heroku 服务器。它在您的服务器和 s3-bucket 之间创建直接通信。

更多详情可以使用this链接

如果想要验证内容或对 sizeof 文件进行一些验证,您必须使用很少的 JavaScript。

【讨论】:

    【解决方案3】:

    我在 Signiant 担任产品经理,专门处理非常大的文件。我也从我们的其他一些 AWS 用户那里看到了这一点。我认为这是使用 TCP / HTTP 上传非常大的文件的神器。

    您可能需要考虑使用 HTTP 以外的其他方式进行上传。我管理的产品 Signiant Flight 是基于 UDP 的,可以轻松处理非常大的文件。起价为 12,000 美元/年。

    还有其他可用的免费和开源 UDP 工具,例如 UDT (http://udt.sourceforge.net) 和 Tsunami (http://tsunami-udp.sourceforge.net)。要使用 UDP,您需要连接 EC2 中的服务器,然后让该服务器将数据写入 S3。

    Flight 是一种托管文件传输服务 - 我们为您在云中运行服务器,速度可高达 800 - 900 Mbps。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-13
      • 2022-11-24
      • 1970-01-01
      • 2018-07-25
      • 2012-02-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多