Få en fils Mime-type i Java

1. Oversikt

I denne opplæringen tar vi en titt på ulike strategier for å få MIME-typer av en fil. Vi vil se på måter å utvide MIME-typene som er tilgjengelige for strategiene, der det er aktuelt.

Vi vil også påpeke hvor vi skal favorisere den ene strategien fremfor den andre.

2. Bruke Java 7

La oss starte med Java 7 - som gir metoden Files.probeContentType (sti) for å løse MIME-typen:

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

Denne metoden bruker installerte FileTypeDetector implementeringer for å undersøke MIME-typen. Den påkaller probeContentType av hver implementering for å løse typen.

Nå, hvis filen gjenkjennes av noen av implementeringene, returneres innholdstypen. Imidlertid, hvis det ikke skjer, blir en systemdetektor for filtype påkalt.

Standardimplementeringene er imidlertid OS-spesifikke og kan mislykkes, avhengig av operativsystemet vi bruker.

I tillegg til det er det også viktig å merke seg at strategien mislykkes hvis filen ikke er tilstede i filsystemet. Videre, hvis filen ikke har utvidelse, vil den føre til feil.

3. Bruke URLtilkobling

URLtilkobling gir flere APIer for å oppdage MIME-typer av en fil. La oss kort utforske hver av dem.

3.1. Ved hjelp av getContentType ()

Vi kan bruke getContentType () Metode av URLtilkobling for å hente MIME-typen til en fil:

@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 tilnærmingen er imidlertid at det er veldig sakte.

3.2. Ved hjelp av gjettContentTypeFromName ()

La oss så se hvordan vi kan bruke gjettContentTypeFromName () for 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 metoden bruker det interne FileNameMap til løse MIME-typen fra utvidelsen.

Vi har også muligheten til å bruke gjettContentTypeFromStream () i stedet, som bruker de første få tegnene i inngangsstrømmen, for å bestemme typen.

3.3. Ved hjelp av getFileNameMap()

En raskere måte å oppnå MIME-typen på URLtilkobling bruker 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 som brukes av alle forekomster av URLtilkobling. Denne tabellen brukes deretter til å løse inndatafiltypen.

Den innebygde tabellen over MIME-typer er veldig begrenset når det gjelder URLtilkobling.

Som standard, klassen bruker innholdstype.egenskaper fil i JRE_HOME / lib. Vi kan imidlertid utvide den ved å spesifisere en brukerspesifikk tabell ved hjelp av content.types.user.table eiendom:

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

4. Bruke MimeTypesFileTypeMap

MimeTypesFileTypeMap løser MIME-typer ved hjelp av filtypen. Denne klassen fulgte med Java 6, og er derfor veldig nyttig når vi jobber med JDK 1.6.

La oss nå se hvordan du bruker den:

@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 sende navnet på filen eller Fil forekomst som parameter for funksjonen. Imidlertid funksjonen med Fil forekomst som parameteren internt kaller den overbelastede metoden som godtar filnavnet som parameter.

Internt slår denne metoden opp en fil som heter mime.types for typeoppløsningen. Det er veldig viktig å merke seg at metoden søker etter filen i en bestemt rekkefølge:

  1. Programmatisk lagt til oppføringer i MimetypesFileTypeMap forekomst
  2. .mime.types i brukerens hjemmekatalog
  3. /lib/mime.types
  4. ressurser navngitt META-INF / mime.types
  5. ressurs navngitt META-INF / mimetypes.default (vanligvis bare funnet i aktivering.jar fil)

Imidlertid, hvis ingen filer blir funnet, vil den returnere applikasjon / oktett-strøm som svaret.

5. Bruke jMimeMagic

jMimeMagic er et bibliotek med begrenset lisens som vi kan bruke til å skaffe MIME-typen til en fil.

La oss starte med å konfigurere Maven-avhengigheten:

 net.sf.jmimemagic jmimemagic 0.1.5 

Vi finner den nyeste versjonen av dette biblioteket på Maven Central.

Deretter vil vi utforske hvordan vi kan arbeide 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 biblioteket kan fungere med en datastrøm og krever ikke at filen skal være til stede i filsystemet.

6. Bruke Apache Tika

Apache Tika er et verktøysett som oppdager og trekker ut metadata og tekst fra en rekke filer. Den har en rik og kraftig API og kommer med tika-core som vi kan bruke for å oppdage MIME-typen til en fil.

La oss begynne med å konfigurere Maven-avhengigheten:

 org.apache.tika tika-core 1.18 

Deretter bruker vi oppdage () metode for å løse 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 avhengig av magiske markører i strømprefikset, for typeoppløsning.

7. Konklusjon

I denne artikkelen har vi sett på de forskjellige strategiene for å skaffe MIME-typen til en fil. Videre har vi også analysert kompromissene mellom tilnærmingene. Vi har også pekt på scenariene der vi bør favorisere den ene strategien fremfor den andre.

Den fullstendige kildekoden som brukes i denne artikkelen er tilgjengelig på GitHub, som alltid.


$config[zx-auto] not found$config[zx-overlay] not found