2014-08-31 66 views
0

我的難題是如何在HTML頁面中嵌入源代碼不可用於互聯網的圖像。顯示存儲在非公開文件夾中的回形針附件

比方說,我有,在Rails /回形針設置,下面的模型:

class Figure < ActiveRecord::Base 
    has_attached_file :image 
    ... 
end 

class User < ActiveRecord::Base 
    ... (authentication code here) 
    has_many :figures 
end 

在控制器:

class FiguresController < ActionController::Base 
    def show 
    # users must be authenticated, and they can only access their own figures 
    @figure = current_user.figures.find(params[:id]) 
    end 
end 

在視圖:

<%= image_tag(@figure.image.url) %> 

的當然,問題在於,使用默認的Paperclip設置圖像存儲在公共目錄和任何其他位置e通過鏈接可以繞過認證/授權訪問存儲的映像。現在

,如果我們告訴回形針在私人位置存儲附件:

class Figure < ActiveRecord::Base 
    has_attached_file :image, path: ":rails_root/private/:class/:attachment/:id_partition/:style/:filename", 
          url: ":rails_root/private/:class/:attachment/:id_partition/:style/:filename" 
    ... 
end 

然後可以很容易地控制誰的形象得到送達:

class FiguresController < ActionController::Base 
    def show 
    @figure = current_user.figures.find(params[:id]) 
    send_file @figure.image.path, type: 'image/jpeg', disposition: 'inline' 
    end 
end 

這一行動的效果在其自己的瀏覽器窗口/選項卡中顯示圖像。

另一方面,image_tag(@figure.image.url)可以理解地產生路由錯誤,因爲源不能被訪問!

因此,有沒有一種方法可以通過image_tag在普通的HTML頁面中顯示圖像,同時仍然限制對圖像的訪問?

回答

0

您需要更改傳遞給has_attached_file:url選項,以便它與數字控制器的路線相匹配。

例如,如果正確的URL是/figures/123的數字與爲123,那麼你傳遞給has_attached_file URL應該

'/figures/:id' 

甚至

'/:class/:id' 

由於:class段會插入名稱的複數小寫下劃線形式。你也可以附加擴展名或文件名(如果你想要的話)(但你必須稍微改變控制器代碼來提取ID)

相關問題