大量AWS上传在随机时间后失败

时间:2016-01-15 19:17:31

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

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

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

这就是我设置的方式:

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分钟后,有时一小时后。我认为签名的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>

3 个答案:

答案 0 :(得分:1)

计划A

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

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

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

FAQ说:

  

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

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

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

B计划

您可以建立一个接受文件上传的minimalistic node.js实例,并通过AWS SDK将其转发给S3。

你也可以在一个免费的heroku实例上运行它,因为它可能被允许每天睡6小时,并且我有以这种方式托管文件上传服务的良好经验

答案 1 :(得分:0)

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

有关详情,请使用this链接

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

答案 2 :(得分:-1)

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

您可能需要考虑使用HTTP以外的其他内容进行上传。我管理的产品Signiant Flight基于UDP,可以轻松处理非常大的文件。定价从12美元/年开始。

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

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