AnA*_*ice 7 ruby-on-rails amazon-s3 paperclip amazon-web-services ruby-on-rails-3
我正在构建的应用程序允许用户上传文件。文件上传到 Amazon S3 的私有存储桶中。
然后用户可以下载该文件,我们通过创建一个过期 URL 来允许下载该文件:
AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => true)
Run Code Online (Sandbox Code Playgroud)
我们遇到的问题是,从通过 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'
Run Code Online (Sandbox Code Playgroud)
关于如何优化、处理这种延迟有什么想法吗?
谢谢
我知道已经过去很多年了,但对于那些带着同样问题来到这里的人来说,这是我发现的。
首先,这就是AWS S3 的工作原理:
进程将新对象写入 Amazon S3 并立即列出其存储桶中的密钥。在更改完全传播之前,该对象可能不会出现在列表中。
我发现处理此行为的最佳方法是等待上传的对象出现在列表中,然后再允许用户下载它。
就像是:
_put_object(filename)
while True:
if _file_exists(filename):
break
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
要检查可用性,我们可以使用client.head_object或client.list_objects_v2。
有一种观点认为 list_objects_v2 工作得更快
您看到延迟多长时间?这种情况多久发生一次?
我们使用https://github.com/PRX/s3-swf-upload-plugin从浏览器直接上传到 s3 ,当我收到文件存在的回调时,我从未见过错误尚未可用。
我们做的另一件事是在第一次上传时将对象标记为一种状态,然后使用 asycnh 进程来验证文件,只有在将其标记为有效后,我们才继续处理它。然而,这会导致延迟,因此对您来说可能不是一个很好的答案。
| 归档时间: |
|
| 查看次数: |
7037 次 |
| 最近记录: |