La validación falló: el archivo de carga tiene una extensión que no coincide con su contenido

Estoy usando gem paperclip para subir archivos. y mi versión de joya de clip es paperclip-4.1.1. Mientras subes un archivo, lo lanzas

Validation failed: Upload file has an extension that does not match its contents. 

Estoy intentando subir un archivo xlsx. y también lo he mencionado en el modelo content_type.

  validates_attachment_content_type :upload_file, :content_type => %w(application/msword application/vnd.ms-office application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet), :message => ', Only XML,EXCEL files are allowed. ' 

No sé por qué está ocurriendo este error. Si tiene alguna idea sobre este error, por favor comparta.

Extracto del registro para mostrar la falla de validación:

 Command :: file -b --mime-type '/tmp/5249540099071db4e41e119388e9dd6220140513-24023-1jlg4zy' [paperclip] Content Type Spoof: Filename file_for_bulk_upload1.xlsx (["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]), content type discovered from file command: . See documentation to allow this combination. Command :: file -b --mime-type '/tmp/6f19a4f96154ef7ce65db1d585abdb2820140513-24023-tt4u1e' [paperclip] Content Type Spoof: Filename file_for_bulk_upload1.xlsx (["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]), content type discovered from file command: 

Las comprobaciones de validación de suplantación de Paperclip están fallando porque el comando de file no puede determinar con precisión el tipo de archivo.

En su content type discovered from file command: . registro content type discovered from file command: . – el espacio en blanco antes del período es el resultado de la salida, es decir, en blanco. Sin embargo, el otro lado de la comparación utiliza puramente la extensión de archivo que se está recogiendo correctamente como un archivo de Excel. De ahí su falla de validación.

La versión actual de Paperclip está usando el file -b --mime-type para determinar el archivo; sin embargo --mime-type no es compatible con todas las implementaciones. Hay un cambio para usar --mime en --mime lugar, pero aún no está en un hito.

Creo que tienes algunas opciones. Lo que elijas depende de cuán preocupado estés con respecto a algún archivo dudoso que se esté cargando y que se le llame un archivo de Excel. Si le preocupa esto, pruebe la opción 1; si no está preocupado vaya a la opción 2 o 3.

1) Anule la verificación de suplantación para usar --mime lugar de --mime-type .

type_from_file_command el type_from_file_command en un inicializador:

 module Paperclip class MediaTypeSpoofDetector private def type_from_file_command # -- original code removed -- # begin # Paperclip.run("file", "-b --mime-type :file", :file => @file.path) # rescue Cocaine::CommandLineError # "" # end # -- new code follows -- begin Paperclip.run("file", "-b --mime :file", :file => @file.path) rescue Cocaine::CommandLineError "" end end end end 

2) Evite la comprobación de file configurando el tipo de archivo totalmente desde su extensión de archivo.

Establezca esta opción de Paperclip en algún lugar que se lea durante la inicialización de la aplicación (por ejemplo, config/application.rb , config/environments/.rb o una config/initializers/paperclip.rb ):

 Paperclip.options[:content_type_mappings] = { xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' } 

3) Desactiva la suplantación por completo.

Anule la verificación de suplantación creando algo como esto en un inicializador:

 module Paperclip class MediaTypeSpoofDetector def spoofed? false end end end 

Actualizar:

La validación que tiene en su modelo no es la causa de este problema. Esto valida qué tipos de archivos puede cargar; lo que está viendo es Paperclip calculando que el tipo de archivo es válido pero su contenido no coincide con el tipo del archivo.

Suponiendo que pueda hacer funcionar la validación de falsificación, existe una anomalía en la validación de su contenido. El mensaje de error que muestra dice “solo XML, los archivos EXCEL están permitidos”, sin embargo, su validación real es verificar los archivos MS Word y Excel, no XML.

Si su mensaje es correcto y desea permitir únicamente archivos xml y Excel, debe cambiar la validación content_type para que sea:

 validates_attachment_content_type :upload_file, :content_type => %w(application/xml application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet), :message => ', Only XML,EXCEL files are allowed. ' 

prueba de esta manera

 validates_attachment_content_type :upload_file, :content_type => ["application/msword", "application/vnd.ms-office application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"], :message => ', Only XML,EXCEL files are allowed. ' 
    Intereting Posts