我需要能够从S3存储桶中以Rails应用程序的形式下载大文件。我通常只是给用户提供3S桶的URL,但我需要它保持屏蔽,以便我可以随意过期或删除URL。我在做类似如下:从S3在Rails上提供大文件
def download
purchase = Purchase.find(params[:id])
data = open(purchase[:download_url])
send_data data.read, filename: purchase[:file_name]
end
它适用于较小的文件,但是,一个就是,说1GB,因为Heroku的超时限制,用户得到一个大胖子的520错误。
我知道这里发生了什么:在发送给用户之前,整个文件正在我的应用程序中打开,这就是为什么大文件超时的原因。我想知道的是,如果有一种解决方法,而不给用户S3 URL?是否可以,而不是下载文件,只是掩盖网址(不重定向)?
任何帮助表示赞赏!
编辑
基于上的其他答案,我试图执行一个到期网址:
def download
purchase = Purchase.find(params[:id])
path = purchase[:download_url].sub! 'entire URL until bucket path', ''
s3URL = AWS::S3::S3Object.new(S3_BUCKET, path)
redirect_to s3URL.url_for(:read).to_s
end
这只是重定向到AWS的AccessDenied
,但也许我建立的网址不正确。再次,任何帮助表示赞赏!
嘿,爱德华谢谢你!我正在选择你的第二个解决方案,除非我使用'url_for'因为我使用了gem的v1。它产生类似于https://mybucket.s3.amazonaws.com/bucket_path_file.zip?AWSAccessKeyId = XXXXX&Expires = 1453753227&Signature = XXXXX&response-content-disposition = attachment' - 我现在的问题是'https://mybucket.s3 .amazonaws.com/bucket_path_file.zip'仍然有效。我应该如何处理我的政策/权限以防止出现这种情况? –
是的,生成的url看起来像一个预先注册的url。你是如何上传你的物品的?您是否将ACL设置为“public-read”? –
是的,它是'公开阅读'。我在我的Rails控制器中创建对象数据,如下所示:'S3_BUCKET.presigned_post(key:“#{SecureRandom.uuid} - $ {filename}”,success_action_status:'201',acl:'public-read')'和然后将这个信息传递给[jQuery-File-Upload](https://github.com/blueimp/jQuery-File-Upload)来处理其余部分。 ACL应该设置为什么? –