7

私はCarrierWaveを使用しています、と私は、ファイル名を検証し、拡張子だけが.gif.png.jpg.jpegまたはファイル拡張子がない場合であれば、ファイルのアップロードを許可したいと思います。ファイル拡張子がある場合にのみファイル拡張子を検証する方法は?再:carrierwave

拡張子のないファイルをアップロードすることがあります。たとえば:

http://t2.gstatic.com/images?q=tbn:ANd9GcTCD2TLvYI8a4ChgBaYK_JaRfedvXLr3HXQfj0arXXAii3o2yjf

私はuploaders/image_uploader.rbに以下の行のコメントを解除する可能性を認識していますが、私はさらにある場合にのみ、これらの拡張機能のいずれかを許可する」というの仕方を知りませんファイル拡張子 "

# Add a white list of extensions which are allowed to be uploaded. 
# For images you might use something like this: 
#def extension_white_list 
# %w(gif jpg jpeg png) 
#end 

だけでなく、次のように私のモデルに私が検証を持っていますが、何らかの理由でbad-extension.badパス。

validates :image, allow_blank: true, format: { 
    with: %r{\.(gif|jpe?g|png)\z}i, 
    message: 'must be a GIF, JPG, or PNG' 
}, if: :filename_has_extension? 

def filename_has_extension? 
    image =~ /\./ 
end 

答えて

0

imageむしろそれはクラスImageUploaderclass ImageUploader < CarrierWave::Uploader::Base)のだ、Stringではありません。

したがって、この行が故障している:

image =~ /\./ 

Stringに変換することによってそれを修正:

image.to_s =~ /\./ 

良好式のようになり、言った:

!(image.to_s =~ /\.[a-z]{1,4}\z/).nil? 

拡張子が1〜4の数字であることを確認しますa-z characters ers。また、何も見つからなければ=~nilを返します。この行はこれを考慮に入れます。

でない場合、=~nilを返します。 .nil?trueを返します。 !はそれをfalseに反転します。したがって、拡張子であることを示します。

の場合、=~はマッチが始まる位置を返します。 0以上であり、ではなく、nilである。 .nil?falseを返します。 !で反転した場合、trueが返されます。従って、であることを示す。

2

まあ検証プロセスでファイルのMIMEタイプの比較を使用しないのはなぜこの

AVAILABLE_MIMETYPE = %w(image/gif) 

validate :mime_type_of ,:if => :if_changed? 


private 
def mime_type_of 
    AVAILABLE::MIMETYPE.include?(MIME::Types.type_for[image_path][0]) 
end 

def if_changed? 
    new_record? or image_changed? 
end 

のようなあなたの探求

何かでもCarrierWaveのお手伝いをすることができますルビーの宝石コールMIMEタイプがあるMIMEタイプ宝石内部チェックを含めますそれは私の場合には、あまりにも

希望にこのヘルプ

0

を助けることができる場合、私はちょうど私のavatar_uploader.rbに変更:

def extension_white_list 
    %w(jpg jpeg gif png) if model.avatar.file.extension.present? 
    end 

:)

関連する問題