7

CarrierWaveを使用しています。ファイル名を検証し、拡張子が.gif、、、、またはファイル拡張子がない場合にのみファイルのアップロードを許可したいと考えています。.png.jpg.jpeg

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

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
4

3 に答える 3

2

さて、検証プロセスでファイルのMimetype比較を使用しないのはなぜですか?あなたの探求に役立つruby gem call mimetypeがあります

このようなもの

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 でも MimeType Gem を含める

このヘルプを願っています

于 2012-08-30T17:27:54.353 に答える
0

imageではなくString、クラスImageUploader( class ImageUploader < CarrierWave::Uploader::Base) です。

したがって、この行に問題があります。

image =~ /\./

に変換して修正しますString

image.to_s =~ /\./

つまり、より適切な表現は次のようになります。

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

拡張子が 1 ~ 4a-z文字で構成されていることを確認します。また、=~は何も見つからない場合に戻りnilます。この行はそれを考慮しています。

拡張子が見つからない場合は ; を返します=~。戻りnilます。そして、それを;に反転します。したがって、拡張がないことを示します。.nil?true!false

一方、延長がある場合=~、試合の開始位置を返します。である0以上、ではない nil.nil?戻りますfalse。で反転する!と、trueが返されます。したがって、延長があることを示します。

于 2012-08-29T22:15:11.537 に答える