Convalida non riuscita: il file di caricamento ha un’estensione che non corrisponde al suo contenuto

Sto usando paperclip gem per caricare file. e la mia versione di paperclip gem è paperclip-4.1.1. Durante il caricamento di un file il suo lancio

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

Sto cercando di caricare un file xlsx. e anche io l’ho menzionato nel modello 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. ' 

Non so perché questo errore sta accadendo. Se hai qualche idea su questo errore per favore condividi.

Estratto dal registro per mostrare l’errore di convalida:

 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: 

I controlli di convalida dello spoofing di Paperclip falliscono perché il comando file non è in grado di determinare con precisione il tipo di file.

Nel content type discovered from file command: . registro content type discovered from file command: . – lo spazio vuoto prima del periodo è il risultato dell’output, ovvero vuoto. Tuttavia, l’altro lato del confronto utilizza esclusivamente l’estensione del file che viene correttamente rilevata come file excel. Quindi il tuo fallimento di validazione.

La versione corrente di Paperclip utilizza il file -b --mime-type per determinare il file, tuttavia --mime-type non è supportato da tutte le implementazioni. C’è una modifica da usare --mime ma non è ancora in una pietra miliare.

Penso che tu abbia alcune opzioni. La scelta dipende da quanto ti preoccupa il fatto che alcuni file dodgy siano stati caricati e che vengano chiamati file excel. Se sei preoccupato, prova l’opzione 1; se non sei preoccupato, vai per l’opzione 2 o 3.

1) Sostituisci il controllo spoofing per utilizzare --mime anziché --mime-type .

Sovrascrivere type_from_file_command in un inizializzatore:

 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) Bypassare il controllo del file impostando il tipo di file totalmente dalla sua estensione.

Imposta questa opzione Paperclip da qualche parte che viene letta durante l’inizializzazione dell’applicazione (ad esempio config/application.rb , config/environments/.rb o un config/initializers/paperclip.rb ):

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

3) Disabilitare lo spoofing del tutto.

Sovrascrivi il controllo spoofing creando qualcosa di simile in un inizializzatore:

 module Paperclip class MediaTypeSpoofDetector def spoofed? false end end end 

Aggiornare:

La convalida che hai nel tuo modello non è la causa di questo problema. Questo convalida quali tipi di file è ansible caricare; quello che stai vedendo è Paperclip che calcola che il tipo di file è valido ma il suo contenuto non corrisponde al tipo del file.

Supponendo che tu possa far funzionare la convalida dello spoofing, c’è un’anomalia con la convalida del contenuto. Il messaggio di errore che viene visualizzato dice “solo XML, file EXCEL sono consentiti”, tuttavia la convalida effettiva sta verificando i file MS Word ed Excel, non xml.

Se il tuo messaggio è corretto e vuoi consentire solo i file xml ed excel, devi cambiare la convalida content_type in modo che sia:

 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. ' 

prova in questo modo

 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. '