Sådan får du en fils Mime-type i Java

1. Oversigt

I denne vejledning ser vi på forskellige strategier til at få MIME-typer af en fil. Vi ser på måder at udvide de tilgængelige MIME-typer til strategierne, hvor det er relevant.

Vi vil også påpege, hvor vi skal favorisere den ene strategi frem for den anden.

2. Brug af Java 7

Lad os starte med Java 7 - som giver metoden Files.probeContentType (sti) til løsning af MIME-typen:

@Test offentligt ugyldigt nårUsingJava7_thenSuccess () {Path path = new File ("product.png"). ToPath (); Streng mimeType = Files.probeContentType (sti); assertEquals (mimeType, "image / png"); } 

Denne metode gør brug af det installerede FileTypeDetector implementeringer for at undersøge MIME-typen. Det påberåber sig probeContentType af hver implementering for at løse typen.

Nu, hvis filen genkendes af nogen af ​​implementeringerne, returneres indholdstypen. Men hvis det ikke sker, påkræves en system-standard filtypedetektor.

Standardimplementeringerne er dog OS-specifikke og kan mislykkes afhængigt af det OS, vi bruger.

Derudover er det også vigtigt at bemærke, at strategien mislykkes, hvis filen ikke er til stede i filsystemet. Desuden, hvis filen ikke har en udvidelse, vil det resultere i fejl.

3. Brug URL-forbindelse

URL-forbindelse indeholder flere API'er til detektering af MIME-typer af en fil. Lad os kort undersøge hver af dem.

3.1. Ved brug af getContentType ()

Vi kan bruge getContentType () metode til URL-forbindelse for at hente en fils MIME-type:

@Test offentlig ugyldig nårUsingGetContentType_thenSuccess () {File file = new File ("product.png"); URLConnection forbindelse = file.toURL (). OpenConnection (); Streng mimeType = connection.getContentType (); assertEquals (mimeType, "image / png"); }

En stor ulempe ved denne tilgang er imidlertid den det er meget langsomt.

3.2. Ved brug af gætContentTypeFromName ()

Lad os derefter se, hvordan vi kan gøre brug af gætContentTypeFromName () til formålet:

@Test offentlig ugyldig nårUsingGuessContentTypeFromName_thenSuccess () {File file = new File ("product.png"); Streng mimeType = URLConnection.guessContentTypeFromName (file.getName ()); assertEquals (mimeType, "image / png"); }

Denne metode gør brug af det interne FileNameMap til løse MIME-typen fra udvidelsen.

Vi har også mulighed for at bruge gætContentTypeFromStream () i stedet, som bruger de første par tegn i inputstrømmen, til at bestemme typen.

3.3. Ved brug af getFileNameMap()

En hurtigere måde at opnå MIME-typen på URL-forbindelse bruger getFileNameMap () metode:

@Test offentlig ugyldig nårUsingGetFileNameMap_thenSuccess () {File file = new File ("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap (); Streng mimeType = fileNameMap.getContentTypeFor (file.getName ()); assertEquals (mimeType, "image / png"); }

Metoden returnerer tabellen over MIME-typer, der bruges af alle forekomster af URL-forbindelse. Denne tabel bruges derefter til at løse inputfiltypen.

Den indbyggede tabel med MIME-typer er meget begrænset, når det kommer til URL-forbindelse.

Som standard, klassen bruger indholdstype.egenskaber fil i JRE_HOME / lib. Vi kan dog udvide det ved at specificere en brugerspecifik tabel ved hjælp af content.types.user.table ejendom:

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

4. Brug MimeTypesFileTypeMap

MimeTypesFileTypeMap løser MIME-typer ved hjælp af filens udvidelse. Denne klasse fulgte med Java 6, og er derfor meget praktisk, når vi arbejder med JDK 1.6.

Lad os nu se, hvordan man bruger det:

@Test offentlig ugyldig, nårUsingMimeTypesFileTypeMap_thenSuccess () {File file = new File ("product.png"); MimetypesFileTypeMap fileTypeMap = ny MimetypesFileTypeMap (); Streng mimeType = fileTypeMap.getContentType (file.getName ()); assertEquals (mimeType, "image / png"); }

Her kan vi enten videregive navnet på filen eller Fil forekomst selv som parameter til funktionen. Funktionen med Fil eksempel, da parameteren internt kalder den overbelastede metode, der accepterer filnavnet som parameter.

Internt søger denne metode efter en fil, der hedder mime.types til typeopløsningen. Det er meget vigtigt at bemærke, at metoden søger efter filen i en bestemt rækkefølge:

  1. Programmatisk tilføjede poster til MimetypesFileTypeMap eksempel
  2. .mime.types i brugerens hjemmekatalog
  3. /lib/mime.types
  4. ressourcer navngivet META-INF / mime.types
  5. ressource navngivet META-INF / mimetypes.default (findes normalt kun i aktivering.jar fil)

Men hvis der ikke findes nogen fil, vender den tilbage applikation / octet-stream som svaret.

5. Brug jMimeMagic

jMimeMagic er et begrænset licenseret bibliotek, som vi kan bruge til at få MIME-typen af ​​en fil.

Lad os starte med at konfigurere Maven-afhængigheden:

 net.sf.jmimemagic jmimemagic 0.1.5 

Vi kan finde den nyeste version af dette bibliotek på Maven Central.

Dernæst undersøger vi, hvordan vi arbejder med biblioteket:

@Test offentlig ugyldig nårUsingJmimeMagic_thenSuccess () {File file = new File ("product.png"); Magisk magi = ny Magi (); MagicMatch match = magic.getMagicMatch (fil, falsk); assertEquals (match.getMimeType (), "image / png"); }

Dette bibliotek kan arbejde med en datastrøm og kræver derfor ikke, at filen er til stede i filsystemet.

6. Brug af Apache Tika

Apache Tika er et værktøjssæt, der registrerer og udtrækker metadata og tekst fra en række filer. Den har en rig og kraftfuld API og leveres med tika-core, som vi kan bruge til at detektere MIME-typen af ​​en fil.

Lad os begynde med at konfigurere Maven-afhængigheden:

 org.apache.tika tika-core 1.18 

Derefter bruger vi opdage() metode til løsning af typen:

@Test offentlig ugyldig nårUsingTika_thenSuccess () {File file = new File ("product.png"); Tika tika = ny Tika (); Streng mimeType = tika.detect (fil); assertEquals (mimeType, "image / png"); }

Biblioteket er afhængig af magiske markører i streampræfikset til typeopløsning.

7. Konklusion

I denne artikel har vi set på de forskellige strategier til opnåelse af MIME-typen af ​​en fil. Desuden har vi også analyseret afvejningerne mellem fremgangsmåderne. Vi har også påpeget de scenarier, hvor vi bør favorisere den ene strategi frem for den anden.

Den fulde kildekode, der bruges i denne artikel, er som altid tilgængelig på GitHub.