如何在Ruby on Rails中存储私人图片和video

这是一个故事:

  • 用户A应该能够上传图像。
  • 用户A应该能够设置隐私。 (“公开”或“私人”)。
  • 用户B不应该能够访问用户A的“私人”图像。

我打算用Paperclip来处理上传。

如果我将图像存储在“RAILS_ROOT / public / images”下,任何猜测文件名称的人都可以访问这些文件。 (例如,访问http://example.com/public/images/uploads/john/family.png )

我需要使用img标签显示图像,所以除了public之外我不能放置文件。

如何确保其他人无法访问用户或组的图像?

(如果我用Paperclip无法做到这一点,那么什么是好的解决方案?)

我会让Paperclip在后端使用S3,将上传的文件设置为私有,然后使用“查询字符串请求validation替代”来生成我的图像标记的URL。

http://docs.amazonwebservices.com/AmazonS3/2006-03-01/index.html?RESTAuthentication.html

您可以使rails服务器输出图像文件的内容。 这是通过控制器动作完成的(大多数动作都是打印HTML,但是这个动作会打印JPG)。

然后,您可以使用授权系统限制控制器级别的访问!

 class ImagesController #Default show Image method streams the file contents. #File doesn't have to be in public/ dir def show send_file @image.filename, :type => @image.content_type, :disposition => 'inline' end # Use your favorite authorization system to restrict access filter_access_to :show, :require => :view, :attribute_check => :true end 

在HTML代码中,您可以使用:

  

以下是我在类似应用程序中执行此操作的方法。

  • 将图像存储在Amazon S3而不是本地文件系统上。 Paperclip支持这一点。
  • 在您的回形针选项中将您的:s3_permissions设置为“private”
  • 在您的图像模型中,定义一个方法,让您输出图像的授权的,有时间限制的URL。

我看起来像这样:

 def s3_url(style = :original, time_limit = 30.minutes) self.attachment.s3.interface.get_link(attachment.s3_bucket.to_s, attachment.path(style), time_limit) end 
  • 然后,只有当他们被授权查看图像时才能向人们显示图像(按照您喜欢的方式实现) – 而不必担心人们猜测/查看私有图像。 它还使它们不会在它们到期时传递URL(URL中有一个令牌)。
  • 请注意,您的应用需要时间为每张图片生成授权url。 因此,如果页面上有多个图像,则会影响加载时间。

如果您想自己托管文件,可以按照建议在控制器级别执行身份validation。 我的一个应用程序有一个AssetController,用于处理来自’private’目录的文件服务。

我想添加的一件事是你应该查看本指南来设置X-Sendfile,它将让你的应用程序告诉web服务器处理实际发送文件。 通过这种方法,您会看到更好的性能。