如何在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服务器处理实际发送文件。 通过这种方法,您会看到更好的性能。
- Angular Rails模板无法正常工作
- 在这台机器上可用的gem中找不到gem’tzinfo-data(> = 0)x86-mingw32’。 运行bundle install以安装缺少的gem
- Rails Javascript压缩/缩小对respond_to javascript响应?
- 在rails应用程序中使用syslog
- 如何使用Carrierwave和Fog检查S3上是否存在图像版本?
- 如何在使用selenium时禁用firefox中的加载项
- 使用带有块的mail_to(mail_to … do)
- 从Rails(表单)向Javascript发送数据
- 如何使用Capybara和RSpec检查会话哈希?