我正在考虑是否在S3而不是本地托管上传的媒体文件(视频和音频)。我需要在每次下载时检查用户的权限。
因此会有像get_file
这样的操作,它首先检查用户的权限,然后从S3获取文件并使用send_file将其发送给用户。
def get_file
if @user.can_download(params[:file_id])
# first, download the file from S3 and then send it to the user using send_file
end
end
但在这种情况下,服务器(不必要地)首先从S3下载文件,然后将其发送给用户。我认为S3的用例是绕过Rails / HTTP服务器堆栈以减少负载。
我认为这是错的吗?
PS。我正在使用CarrierWave进行文件上传。不确定这是否相关。
答案 0 :(得分:3)
Amazon S3提供了一种名为RESTful经过身份验证的读取,这些读取基本上是可保护内容的超时URL。
CarrierWave为此提供支持。只需将S3访问策略声明为经过身份验证的读取:
config.s3_access_policy = :authenticated_read
然后model.file.url
将自动生成RESTful URL。
答案 1 :(得分:-1)
通常,您会在页面中嵌入S3 URL,以便客户端的浏览器直接从Amazon获取文件。但请注意,这会暴露原始未受保护的URL。你可以用长哈希命名文件而不是可预测的东西,所以它至少是不可猜测的 - 但是一旦公开了这个URL,它就基本上对互联网开放了。因此,如果您绝对需要对文件进行访问控制,那么您需要像现在一样代理它。在这种情况下,您可以决定将文件存储在本地更好。