7

estoy usando CarrierWave, y me gustaría validar los nombres de archivo y sólo permiten la carga de archivos si la extensión es .gif, .png, .jpg, .jpeg, o si no hay ninguna extensión de archivo.¿Cómo validar una extensión de archivo solo si hay una extensión de archivo? Re: carrierwave

A veces los usuarios cargan archivos sin extensiones. Por ejemplo:

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

Soy consciente de la posibilidad de descomentando las siguientes líneas en uploaders/image_uploader.rb, pero no sé de una manera de decir, además, "permiten que cualquiera de estas extensiones sólo si hay una extensión de archivo ".

# 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 

A su vez, en mi modelo que tienen una validación de la siguiente manera, pero por alguna razón bad-extension.bad pases.

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 

Respuesta

0

image no es un String, sino que es de la clase ImageUploader (class ImageUploader < CarrierWave::Uploader::Base).

Por lo tanto esta línea es la culpa:

image =~ /\./ 

corregirlo mediante la conversión a un String:

image.to_s =~ /\./ 

Dicho esto, una mejor expresión sería:

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

Se asegura de que la extensión consta de uno a cuatro a-z charact ers. Además, =~ devuelve nil si no se encuentra nada, y esta línea toma eso en cuenta.

Si una extensión es no encontrado, =~ devuelve nil; entonces .nil? devolverá true; y ! lo invertirá a false; lo que indica que hay sin extensión.

Si por el contrario existe es una extensión, =~ devuelve la posición donde se inicia la coincidencia; que es 0 o superior, que es nonil; entonces .nil? devolverá false; y cuando se invierte por !, se devuelve true; lo que indica que hay es una extensión.

2

Bueno ¿Por qué no usar la comparación Mimetype del archivo en el proceso de validación no es gema de rubíes tipo MIME de llamadas que pueden ayudarle en su búsqueda

algo como esto

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 

Incluso CarrierWave con check MimeType Gem Internamente si eso puede ayudar también

Espero que esta ayuda

0

en mi caso me acaba de cambiar en mi avatar_uploader.rb:

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

:)

Cuestiones relacionadas