Amazon S3,如何处理从上传到对象可用性的延迟

问题描述 投票:3回答:2

我正在构建的应用允许用户上传文件。该文件被上传到私有存储桶中的Amazon S3。

然后用户可以下载文件,我们通过创建时间到期的URL来允许该文件:

AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => true)

我们遇到的问题是,通过AWS :: S3 :: S3Object.url_for从上传到可用性的延迟很短。如果用户尝试在上传后立即下载文件,Amazon会出现错误:

215412-NameError (uninitialized constant Attachment::AWS):
215413-  app/models/attachment.rb:32:in `authenticated_url'
215414-  app/controllers/attachments_controller.rb:33:in `show'

关于如何优化,处理此延迟的任何想法?

感谢

ruby-on-rails ruby-on-rails-3 amazon-s3 amazon-web-services paperclip
2个回答
1
投票

您看到延迟多长时间?多久发生一次?

[我们使用https://github.com/PRX/s3-swf-upload-plugin从浏览器直接上传到s3,并且当我得到该文件存在的回调时,我从未见过尚不存在的错误。

[我们要做的另一件事是,在第一次上传时将对象标记为一个状态,然后使用asycnh进程来验证文件,只有将其标记为有效后,我们才能继续进行处理。但是,这会导致延迟,因此对您来说可能不是一个很好的答案。


0
投票

我知道已经好几年了,但是对于那些来这里遇到同样问题的人,这是我所发现的。

首先,这就是AWS S3 works的方式:

进程将新对象写入Amazon S3,并立即在其存储桶中列出密钥。在更改完全传播之前,该对象可能不会出现在列表中。

我发现解决此问题的最佳方法是,等待上载的对象出现在列表中,然后再允许用户下载它。

类似:

_put_object(filename)
while True:
    if _file_exists(filename):
        break
    time.sleep(1)

要检查可用性,我们可以使用client.head_objectclient.list_objects_v2

[opinion有list_objects_v2可以更快地工作

© www.soinside.com 2019 - 2024. All rights reserved.