【发布时间】:2016-01-19 19:54:16
【问题描述】:
我需要能够从 Rails 应用程序和 S3 存储桶下载大文件。我通常只会向用户提供 3S 存储桶的 URL,但我需要它保持屏蔽状态,以便我可以随意过期或删除 URL。我正在做类似以下的事情:
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 的情况下解决这个问题?是否有可能,而不是下载文件,只是屏蔽 URL(而不是重定向)?
感谢任何帮助!
编辑
基于 SO 上的其他答案,我尝试实现一个过期 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 不正确。再次感谢任何帮助!
【问题讨论】:
标签: ruby-on-rails heroku amazon-s3