2011-05-22 59 views
5

想要确保只有登录的用户才能查看/下载从carrierwave上传的文件。确保Carrierwave上传的文件

这是如何完成的?

将商店目录从公共移动到RAILS_ROOT,创建显示和下载的路线。

问题是如果它的图像,<%= image_tag(photo.image_url) %>我得到完整路径/Users/myname/projects/appname/files/image/id/image.png,所以不会渲染。

此外,如果视图不会渲染我的绝对路径,只是从站点的相对路径,会很好。

回答

3

这实际上是一件非常容易的事情。这是一个讨论sendfile和x-sendfile的博客。这应该让你朝着正确的方向发展。

http://www.therailsway.com/2009/2/22/file-downloads-done-right

这里是它的轨道文档。

http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_file

由于这是在控制器级别的所有处理,只要确保你有检查,如果用户被授权,然后使用由send_file方法在你的控制器动作的before_filter。

+0

已经看到了这篇文章,并要求我将store_dir从公共移除,但我认为我做错了什么。 store_dir是“/#{Rails.root.to_s}/files/#{model.class.to_s.underscore}/#{mounted_as}/#{model.customer_id}/#{model.id}”。继续得到ActionController :: RoutingError(没有路由匹配“/Users/.../42/142/thumb_9-cars.jpg”) – pcasa 2011-05-22 22:38:00

+0

是的,你将不会有一个路径在web应用程序中使用该路径的文件,这是为什么你使用send_file ...所以你可以将它指向一个常规的文件系统路径。如果carrierwave将文件存储在文件系统中,并且image_url是正确的路径。一切都应该工作。请记住,您要将图像标记指向输出图像的控制器的路径,而不是实际的图像路径。 – quest 2011-05-22 22:46:20