rails爲paperclip上傳文件添加訪問控制

0 前言

         由paperclip上傳的文件默認是放在rails項目的public目錄下的,也就是說,只要能得到該文件的URL,就可以直接訪問/下載該文件,如果要對該文件添加訪問控制,就需要更改paperclip的默認上傳位置。

1 更改paperclip默認的上傳位置

       若有一個story類,每個story有一個封面cover,該cover是一張圖片,就可以這樣更改model定義:
class Story < ActiveRecord::Base
  has_attached_file :cover,
  :styles=>{:small=>"32x32"}, 
  :path => ":rails_root/paperclip/:class/:attachment/:id/:style/:filename",
  :url => "/paperclip/:class/:attachment/:id/:style/:filename"
end

        要同時修改path和url,url是相對於rails工程而言,被rails app用來獲取圖片渲染頁面;而path是相對於rails app服務器而言,在整個宿主文件系統中的路徑。必須同時修改path和url。
        這裏,將保存paperclip的上傳文件的目錄設置爲rails工程根目錄下的paperclip目錄。

2 添加controller

      在routes.rb中添加路由:
get "/paperclip/:class/:attachment/:id/:style/:filename",to:"assets#show"

     添加assets_controller.rb文件:
class AssetsController < ApplicationController
  def show
    cls=params[:class].singularize.capitalize.constantize
    asset=cls.find params[:id]
    send_file asset.send(params[:attachment].singularize).path(params[:style])
  end
end

      在提交的參數中params[:class]是複數形式,而通常類定義都是單數如Story,params[:attachment]是也複數形式而類定義中cover爲單數,所以都要將他們變成單數,如果類中定義的attachment是複數形式,那麼這裏attachment就不必轉換爲單數,否則會引發NoMethod異常。
      現在,所有的paperclip資源都由AssetsController控制,所以在其中添加諸如身份登錄驗證等before_filter就很方便了。在加入身份驗證後,即便用戶得到該cover的URL,在未登錄的情況下,也無法直接訪問該圖片了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章