1

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

4

2 回答 2

3

Amazon S3 提供了一种称为 RESTful 身份验证读取的功能,它们基本上是指向其他受保护内容的可超时 URL。

CarrierWave 对此提供了支持。只需将 S3 访问策略声明为经过身份验证的读取:

  config.s3_access_policy = :authenticated_read

然后model.file.url会自动生成 RESTful URL。

于 2011-05-08T00:23:59.343 回答
-1

通常,您会在页面中嵌入 S3 URL,以便客户端的浏览器直接从 Amazon 获取文件。但是请注意,这会暴露原始未受保护的 URL。您可以使用长散列而不是可预测的名称来命名文件,因此它至少是不可猜测的——但是一旦该 URL 公开,它就基本上对 Internet 开放。因此,如果您绝对总是需要对文件进行访问控制,那么您需要像现在一样代理它。在这种情况下,您可能会决定将文件存储在本地更好。

于 2011-04-29T13:25:18.863 回答