2011-08-24 13 views
5

Uso la funzionalità Spring 3 per caricare un file. Mi piacerebbe sapere il modo migliore per verificare che un file sia di un certo tipo, in particolare un file CSV. Sono piuttosto sicuro che controllare l'estensione sia inutile e attualmente sto verificando il tipo di contenuto del file che viene caricato. Mi assicuro solo che sia di tipo "text/csv". E per chiarire questo è un file caricato dal client che significa che non ho il controllo delle sue origini.Spring MVC Upload File - Come viene determinato il tipo di contenuto?

Sono curioso di sapere come Spring/il browser determina qual è il tipo di contenuto? È questo il modo migliore/più sicuro per determinare quale tipo di file è stato caricato? Posso essere sicuro al 100%?

AGGIORNAMENTO: Ancora una volta non mi chiedo come determinare quale sia il tipo di contenuto di un file ma come viene determinato il tipo di contenuto. Come fa la primavera/il browser a sapere che il tipo di contenuto è un "testo/csv" basato sul file caricato?

+0

Aveva lo stesso problema. Perché Spring non supporta l'opzione "Determinato dal contenitore" come nei soliti file java? Se imposto l'enconding nel mio modulo Maven come UTF-8, mi aspetto che i miei file abbiano questa codifica di default e non avrò bisogno di cambiarli manualmente. – borjab

risposta

1

È possibile utilizzare

org.springframework.web.multipart.commons.CommonsMultipartFile oggetto.

ha il metodo getContentType();.

un'occhiata al seguente esempio http://www.ioncannon.net/programming/975/spring-3-file-upload-example/

si può semplicemente aggiungere il semplice test su un oggetto CommonsMultipartFile e reindirizzare alla pagina di errore se il tipo di contenuto non è corretto.

+0

Penso che la tua domanda sia stata fraintesa. Conosco getContentType() e lo sto già usando. La domanda è: come viene determinato quel tipo di contenuto? Sto avendo un dibattito con un collega e lui pensa che il tipo di contenuto non sia più utile dell'estensione in quanto può essere arbitrariamente impostato su qualsiasi cosa. Ma sono curioso di sapere come Spring/il browser dice che questo file è un "testo/csv"? Lo scopo di questo è di rifiutare un file che non è un vero file CSV, come puoi davvero essere sicuro che lo sia? – sauce

0

Perché non basta prendere il nome del file in voi validatore e dividerlo, il tipo di file è fileName.split ("\"). [Filename.length() - 1] stringa

+0

Le estensioni dei file sono essenzialmente inutili, è uno sguardo nella giusta direzione ma non lo taglierà. Potresti avere un file senza estensione che è in realtà un file CSV e in qualche modo il browser/Spring sa che tipo di file è. Mi chiedo come lo sappia. – sauce

1

Così si può anche contare il numero di virgole nel file per riga. Normalmente dovrebbe essere lo stesso numero di virgole su ogni riga del file affinché sia ​​un file CSV valido.

+0

Non è una cattiva idea per i file di piccole dimensioni ... ma i file con linee da 100k probabilmente non è pratico per esaminarli tutti. Suppongo che tu possa controllare le prime 10 linee o qualcosa del genere.Non esattamente quello che stavo cercando, ma solo un altro modo di convalidare manualmente. Spero solo di sapere che potrei fare affidamento sul tipo di contenuto impostato correttamente. – sauce

0

Ok, in questo caso suggerisco di utilizzare la libreria java Csvreader. Devi solo controllare il tuo oggetto csvreader e basta.

0

Per quanto ne so, il metodo getContentType(String) ottiene il suo valore da qualsiasi cosa l'agente dell'utente indichi, quindi è giusto essere cauti in quanto ciò può essere facilmente falsificato.

Per i file binari è possibile controllare lo magic number o utilizzare una libreria, ad esempio mime-util o jMimeMagic. C'è anche Files.probeContentType(String) da Java 7 ma funziona solo con i file su disco e sono stati segnalati errori su alcuni sistemi operativi.

Problemi correlati