我建立的应用程序允许用户上传文件。该文件将在专用存储桶中上载到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,从上传到可用性的延迟很短。如果用户尝试在上传后立即下载文件,则亚马逊会出错:
215412-NameError (uninitialized constant Attachment::AWS):
215413- app/models/attachment.rb:32:in `authenticated_url'
215414- app/controllers/attachments_controller.rb:33:in `show'
有关如何优化,处理此延迟的任何想法?
由于
答案 0 :(得分:1)
你看到多长时间的延迟?这种情况多久发生一次?
我们使用https://github.com/PRX/s3-swf-upload-plugin从浏览器直接上传到s3,当我收到该文件存在的回调时,我从未看到过它尚未出现的错误。
我们要做的另一件事是在首次上传时将对象标记为一个状态,然后使用asycnh进程验证文件,并且只有在标记为有效之后,我们才会继续处理它。 这会导致延迟,所以对你来说可能不是一个很好的答案。
答案 1 :(得分:0)
我知道已经有好几年了,但是对于那些来这里遇到同样问题的人来说,这就是我的发现。
首先,这就是AWS S3 works的方式:
一个进程将一个新对象写入Amazon S3,并立即在其存储桶中列出密钥。在更改完全传播之前,该对象可能不会出现在列表中。
我发现解决此问题的最佳方法是,等待上载的对象出现在列表中,然后再允许用户下载它。
类似的东西:
_put_object(filename)
while True:
if _file_exists(filename):
break
time.sleep(1)
要检查可用性,我们可以使用client.head_object或client.list_objects_v2。
有一个opinion,list_objects_v2的运行速度更快