2011-08-02 93 views
9

我使用paperclip進行文件上傳。有如下驗證:Paperclip-驗證pdfs與content_type ='application/octet-stream'

validates_attachment_content_type :upload, :content_type=>['application/pdf'], :if => Proc.new { |module_file| !module_file.upload_file_name.blank? }, :message => "must be in '.pdf' format"

但是,我的客戶今天抱怨說,他是不是能夠上傳pdf。調查後,我從請求標題中瞭解到,提交的文件有content_type=application/octet-stream

允許application/octet-stream將允許上傳許多類型的文件。

請建議一個解決方案來處理這個問題。

回答

7

似乎像回形針沒有正確檢測內容類型。下面是我如何能夠使用自定義內容類型的檢測和驗證(型號代碼)進行修復:

VALID_CONTENT_TYPES = ["application/zip", "application/x-zip", "application/x-zip-compressed", "application/pdf", "application/x-pdf"] 

before_validation(:on => :create) do |file| 
    if file.media_content_type == 'application/octet-stream' 
    mime_type = MIME::Types.type_for(file.media_file_name)  
    file.media_content_type = mime_type.first.content_type if mime_type.first 
    end 
end 

validate :attachment_content_type 

def attachment_content_type 
    errors.add(:media, "type is not allowed") unless VALID_CONTENT_TYPES.include?(self.media_content_type) 
end 
3

對於回形針3.3和Rails 3,我這樣做有點不同

before_validation on: :create do 
    if media_content_type == 'application/octet-stream' 
    mime_type = MIME::Types.type_for(media_file_name) 
    self.media_content_type = mime_type.first if mime_type.first 
    end 
end 

validates_attachment :media, content_type: { content_type: VALID_CONTENT_TYPES } 

順便說一下,我需要這樣做,因爲使用attach_file對Capybara和幻影js進行測試不會爲某些文件生成正確的mime類型。

+0

我發現,避免了文件的處理與不正確的MIME類型,我不得不使用這是一個before_file_post_process方法。 –

5

基於上述,這裏是我結束了它與回形針4.2兼容和軌道4:

before_post_process on: :create do  
    if media_content_type == 'application/octet-stream' 
    mime_type = MIME::Types.type_for(media_file_name) 
    self.media_content_type = mime_type.first.to_s if mime_type.first 
    end 
end