2014-02-10 57 views
1

這是相當瑣碎使用image_tag方法在公共目錄,但怎麼樣,我不想公開訪問圖像,圖像管理員只,也許服務的圖像。如何顯示來自公共目錄之外的圖像文件?

我應該如何控制我的控制器和視圖,以便image_tag方法爲root/private/images提供圖像,而不是root/public。此外,這將是完全安全的,對嗎?如果我有私人圖片,並且只想爲管理員提供這些圖片,那麼使用簡單的if語句來檢查用戶是否是管理員,然後使用image_tag爲他們提供來自公共文件夾外部的私人圖像是否安全?

我很感興趣的是如何做到這一點沒有回形針。 (回形針甚至沒有提及,所以它不是一個重複的)

回答

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 

假設你有另一種方式來告訴這個,你可以有/管理/圖像路線開始一個控制器動作的所有路由,然後那裏調用呈現的路徑的其餘部分文件。例如:

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" 

這在理論上的工作,但它可能會比我在想

這裏圖片更加複雜將在公共/管理/圖片託管,但掛的/管理/照片/ ID

+0

似乎相當可行的,我會考慮這個:)所以公共目錄裏面實際上並沒有公開? 'public> kitty.jpg'會被公開,但public'admin> kitty.jpg'對於一個客人來說是完全不可訪問的? – Starkers

+0

哦,好點,也許把它們放在/ private/admin/images之類的其他目錄中。我被分開了。編輯它! –

0

我不知道你是如何處理的管理員身份驗證,但假設你有一個單獨的登錄。

  1. 將您的圖像作爲BLOB存儲在MySQL中。

  2. 返回軌道控制器使用send_data與認證請求的圖像文件

link有一個例子

+0

這會工作,但我的圖片路徑,而存儲在我的應用程序 – Starkers

相關問題