2011-08-02 6 views
9

ファイルのアップロードにpaperclipを使用していました。以下のように検証して:Paperclip-validate pdfs with 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

paperclipのようなコンテンツタイプは正しく検出されません。ここでは(モデルのコードが)私は、カスタムコンテンツタイプの検出および検証を使用して、それを修正することができた方法です:

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 } 

これをしませんでしたちなみに、私はCapybaraとphantom jsでattach_fileを使ってテストすると、いくつかのファイルに対して正しいMIMEタイプが生成されなかったので、これを行う必要がありました。以上を踏まえ

+0

私はそれは私が使用していた不正なMIMEタイプとファイルの処理を避けるために発見しましたこれはbefore_file_post_processメソッドです。 –

5

は、ここで私はクリップ4.2とRails 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 
関連する問題