如何在公共目录外显示图像文件?

时间:2014-02-10 04:15:41

标签: ruby-on-rails

使用image_tag方法在公共目录中提供图像非常简单,但是我不希望公开访问的图像,仅限管理员的图像,可能。< /强>

我的控制器和视图应如何显示,以便image_tag方法提供来自root/private/images而非root/public的图像。而且,这将是完全安全的,对吧?如果我有私有图像,并且只想向管理员提供服务,那么一个简单的if语句来检查用户是否是管理员,然后使用image_tag为他们提供公共文件夹外部的私有图像是安全的吗?

我对如何执行没有回形针感兴趣。 (回形针甚至没有提到,所以它不是重复的)

2 个答案:

答案 0 :(得分:0)

我不确定您是如何处理管理员身份验证的,但假设您有单独的登录信息。

  1. 将图像存储为MySQL中的BLOB。

  2. 使用带有身份验证的rails控制器中的send_data返回请求的图像文件

  3. 这个link有一个例子

答案 1 :(得分:0)

假设图像与附有回形针的模型相关,则可以执行此操作。 (我真的推荐这个。)

def show
    @image = Image.find(params[:id])
    published_image = @image.published_image
    respond_to do |format|
        format.all {
            if published_image
                send_file published_image.attached_image.path, :type=> published_image.attached_image_content_type
            else
                raise ActionController::RoutingError.new('Not Found')
            end
         }
    end
end

假设您有另一种方法可以告诉它,您可以让所有以/ admin / image路由开头的路由到控制器操作,然后在路径的其余部分调用渲染文件。示例:

routes.rb
    get 'admin/photo/*other', to: 'admin#photos'

admin.controller.rb
    def photos
        if current_user.admin?
             render file: Rails.root.join("private","admin","images",request.path.gsub("/admin/photo/","")
        else
             render :file => "public/401.html", :status => :unauthorized
        end
    end

view
    image_tag "/admin/photos/id.jpg"

这在理论上是有效的,但它可能比我想的更复杂

此处的图片将托管在public / admin / images中,但链接到/ admin / photos / id