在这种情况下,Amazon S3是否有帮助?

时间:2011-04-29 12:58:24

标签: ruby-on-rails-3 authentication amazon-s3 carrierwave sendfile

我正在考虑是否在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进行文件上传。不确定这是否相关。

2 个答案:

答案 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,它就基本上对互联网开放了。因此,如果您绝对需要对文件进行访问控制,那么您需要像现在一样代理它。在这种情况下,您可以决定将文件存储在本地更好。