Ottenere il tipo Mime di un file in Java

1. Panoramica

In questo tutorial, daremo un'occhiata a varie strategie per ottenere i tipi MIME di un file. Esamineremo i modi per estendere i tipi MIME disponibili alle strategie, ove applicabile.

Indicheremo anche dove dovremmo favorire una strategia rispetto all'altra.

2. Utilizzo di Java 7

Cominciamo con Java 7, che fornisce il metodo Files.probeContentType (percorso) per risolvere il tipo MIME:

@Test public void whenUsingJava7_thenSuccess() { Path path = new File("product.png").toPath(); String mimeType = Files.probeContentType(path); assertEquals(mimeType, "image/png"); } 

Questo metodo utilizza le implementazioni FileTypeDetector installate per sondare il tipo MIME. Si invoca la probeContentType di ogni implementazione per risolvere il tipo.

Ora, se il file viene riconosciuto da una delle implementazioni, viene restituito il tipo di contenuto. Tuttavia, se ciò non accade, viene richiamato un rilevatore del tipo di file predefinito dal sistema.

Tuttavia, le implementazioni predefinite sono specifiche del sistema operativo e potrebbero non riuscire a seconda del sistema operativo che stiamo utilizzando.

In aggiunta a ciò, è anche importante notare che la strategia fallirà se il file non è presente nel filesystem. Inoltre, se il file non ha un'estensione, si verificherà un errore.

3. Utilizzo di URLConnection

URLConnection fornisce diverse API per rilevare i tipi MIME di un file. Esploriamo brevemente ciascuno di essi.

3.1. Utilizzo di getContentType ()

Possiamo usare il metodo getContentType () di URLConnection per recuperare il tipo MIME di un file:

@Test public void whenUsingGetContentType_thenSuccess(){ File file = new File("product.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); assertEquals(mimeType, "image/png"); }

Tuttavia, uno dei principali svantaggi di questo approccio è che è molto lento .

3.2. Utilizzo di guessContentTypeFromName ()

Successivamente, vediamo come possiamo utilizzare guessContentTypeFromName () per lo scopo:

@Test public void whenUsingGuessContentTypeFromName_thenSuccess(){ File file = new File("product.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); assertEquals(mimeType, "image/png"); }

Questo metodo utilizza la FileNameMap interna per risolvere il tipo MIME dall'estensione .

Abbiamo anche la possibilità di utilizzare invece guessContentTypeFromStream () , che utilizza i primi pochi caratteri del flusso di input, per determinare il tipo.

3.3. Utilizzo di getFileNameMap ()

Un modo più veloce per ottenere il tipo MIME utilizzando URLConnection è utilizzare il metodo getFileNameMap () :

@Test public void whenUsingGetFileNameMap_thenSuccess(){ File file = new File("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); assertEquals(mimeType, "image/png"); }

Il metodo restituisce la tabella dei tipi MIME utilizzati da tutte le istanze di URLConnection. Questa tabella viene quindi utilizzata per risolvere il tipo di file di input.

La tabella incorporata dei tipi MIME è molto limitata quando si tratta di URLConnection .

Per impostazione predefinita, la classe utilizza il file content-types.properties in JRE_HOME / lib . Possiamo, tuttavia, estenderlo, specificando una tabella specifica dell'utente utilizzando la proprietà content.types.user.table :

System.setProperty("content.types.user.table",""); 

4. Utilizzo di MimeTypesFileTypeMap

MimeTypesFileTypeMap risolve i tipi MIME utilizzando l'estensione del file. Questa classe è arrivata con Java 6 e quindi è molto utile quando lavoriamo con JDK 1.6.

Ora vediamo come usarlo:

@Test public void whenUsingMimeTypesFileTypeMap_thenSuccess() { File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); assertEquals(mimeType, "image/png"); }

Qui, possiamo passare il nome del file o la stessa istanza di File come parametro alla funzione. Tuttavia, la funzione con Istanza di file come parametro chiama internamente il metodo sovraccarico che accetta il nome del file come parametro.

Internamente, questo metodo cerca un file chiamato mime.types per la risoluzione del tipo. È molto importante notare che il metodo cerca il file in un ordine specifico:

  1. Voci aggiunte a livello di codice all'istanza MimetypesFileTypeMap
  2. . mime.types nella directory home dell'utente
  3. /lib/mime.types
  4. risorse denominate META-INF / mime.types
  5. risorsa denominata META-INF / mimetypes.default (di solito si trova solo nel file activation.jar )

Tuttavia, se non viene trovato alcun file, restituirà application / octet-stream come risposta.

5. Utilizzo di jMimeMagic

jMimeMagic è una libreria con licenza restrittiva che possiamo utilizzare per ottenere il tipo MIME di un file.

Cominciamo configurando la dipendenza Maven:

 net.sf.jmimemagic jmimemagic 0.1.5 

Possiamo trovare l'ultima versione di questa libreria su Maven Central.

Successivamente, esploreremo come lavorare con la libreria:

@Test public void whenUsingJmimeMagic_thenSuccess() { File file = new File("product.png"); Magic magic = new Magic(); MagicMatch match = magic.getMagicMatch(file, false); assertEquals(match.getMimeType(), "image/png"); }

Questa libreria può funzionare con un flusso di dati e quindi non richiede che il file sia presente nel file system.

6. Utilizzo di Apache Tika

Apache Tika è un set di strumenti che rileva ed estrae metadati e testo da una varietà di file. Ha un'API ricca e potente e viene fornito con tika-core che possiamo utilizzare per rilevare il tipo MIME di un file.

Cominciamo configurando la dipendenza Maven:

 org.apache.tika tika-core 1.18 

Successivamente, utilizzeremo il metodo detect () per risolvere il tipo:

@Test public void whenUsingTika_thenSuccess() { File file = new File("product.png"); Tika tika = new Tika(); String mimeType = tika.detect(file); assertEquals(mimeType, "image/png"); }

La libreria si basa su indicatori magici nel prefisso del flusso, per la risoluzione del tipo.

7. Conclusione

In questo articolo, abbiamo esaminato le varie strategie per ottenere il tipo MIME di un file. Inoltre, abbiamo anche analizzato i compromessi degli approcci. Abbiamo anche indicato gli scenari in cui dovremmo privilegiare una strategia rispetto all'altra.

Il codice sorgente completo utilizzato in questo articolo è disponibile su GitHub, come sempre.