Het mime-type van een bestand verkrijgen in Java

1. Overzicht

In deze tutorial bekijken we verschillende strategieën om MIME-typen van een bestand te krijgen. We zullen kijken naar manieren om de beschikbare MIME-typen uit te breiden naar de strategieën, waar van toepassing.

We zullen ook aangeven waar we de voorkeur moeten geven aan de ene strategie boven de andere.

2. Java 7 gebruiken

Laten we beginnen met Java 7 - die de methode biedt Files.probeContentType (pad) voor het oplossen van het MIME-type:

@Test public void whenUsingJava7_thenSuccess () {Padpad = nieuw bestand ("product.png"). ToPath (); String mimeType = Files.probeContentType (pad); assertEquals (mimeType, "image / png"); } 

Deze methode maakt gebruik van de installed FileTypeDetector implementaties om het MIME-type te onderzoeken. Het roept de probeContentType van elke implementatie om het type op te lossen.

Als het bestand nu wordt herkend door een van de implementaties, wordt het inhoudstype geretourneerd. Als dat echter niet gebeurt, wordt een systeemstandaard bestandstypedetector aangeroepen.

De standaardimplementaties zijn echter OS-specifiek en kunnen mislukken, afhankelijk van het besturingssysteem dat we gebruiken.

Daarnaast is het ook belangrijk op te merken dat de strategie mislukt als het bestand niet aanwezig is in het bestandssysteem. Bovendien, als het bestand geen extensie heeft, zal dit resulteren in een fout.

3. Met behulp van URLConnection

URLConnection biedt verschillende API's voor het detecteren van MIME-typen van een bestand. Laten we ze allemaal kort verkennen.

3.1. Gebruik makend van getContentType ()

We kunnen gebruiken getContentType () methode van URLConnection om het MIME-type van een bestand op te halen:

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

Een groot nadeel van deze benadering is echter dat het is erg traag.

3.2. Gebruik makend van radenContentTypeFromName ()

Laten we vervolgens kijken hoe we gebruik kunnen maken van de radenContentTypeFromName () Voor het doel:

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

Deze methode maakt gebruik van de interne Bestandsnaamkaart naar los het MIME-type van de extensie op.

We hebben ook de mogelijkheid om te gebruiken radenContentTypeFromStream () in plaats daarvan, die de eerste paar tekens van de invoerstroom gebruikt om het type te bepalen.

3.3. Gebruik makend van getFileNameMap()

Een snellere manier om het MIME-type te verkrijgen met URLConnection gebruikt de getFileNameMap () methode:

@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"); }

De methode retourneert de tabel met MIME-typen die door alle instanties van URLConnection. Deze tabel wordt vervolgens gebruikt om het type invoerbestand op te lossen.

De ingebouwde tabel met MIME-typen is zeer beperkt als het gaat om URLConnection.

Standaard, de klas gebruikt content-types.properties bestand in JRE_HOME / lib. We kunnen het echter uitbreiden door een gebruikerspecifieke tabel op te geven met de content.types.user.table eigendom:

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

4. Met behulp van MimeTypesFileTypeMap

MimeTypesFileTypeMap lost MIME-typen op door de bestandsextensie te gebruiken. Deze klasse werd geleverd met Java 6 en is daarom erg handig als we met JDK 1.6 werken.

Laten we nu eens kijken hoe we het kunnen gebruiken:

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

Hier kunnen we de naam van het bestand of de het dossier instantie zelf als de parameter voor de functie. De functie met het dossier instantie als de parameter intern de overbelaste methode aanroept die de bestandsnaam als de parameter accepteert.

Intern zoekt deze methode een bestand op met de naam mime.types voor de type resolutie. Het is erg belangrijk op te merken dat de methode in een specifieke volgorde naar het bestand zoekt:

  1. Programmatisch toegevoegde vermeldingen aan het MimetypesFileTypeMap voorbeeld
  2. .mime.types in de homedirectory van de gebruiker
  3. /lib/mime.types
  4. bronnen genoemd META-INF / mime.types
  5. resource met de naam META-INF / mimetypes.default (meestal alleen te vinden in de activering.jar het dossier)

Als er echter geen bestand wordt gevonden, keert het terug application / octet-stream als antwoord.

5. Met behulp van jMimeMagic

jMimeMagic is een bibliotheek met beperkte licentie die we kunnen gebruiken om het MIME-type van een bestand te verkrijgen.

Laten we beginnen met het configureren van de Maven-afhankelijkheid:

 net.sf.jmimemagic jmimemagic 0.1.5 

We kunnen de nieuwste versie van deze bibliotheek vinden op Maven Central.

Vervolgens onderzoeken we hoe u met de bibliotheek kunt werken:

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

Deze bibliotheek kan met een gegevensstroom werken en vereist daarom niet dat het bestand aanwezig is in het bestandssysteem.

6. Apache Tika gebruiken

Apache Tika is een toolset die metadata en tekst uit verschillende bestanden detecteert en extraheert. Het heeft een rijke en krachtige API en wordt geleverd met tika-core waar we gebruik van kunnen maken om het MIME-type van een bestand te detecteren.

Laten we beginnen met het configureren van de Maven-afhankelijkheid:

 org.apache.tika tika-core 1.18 

Vervolgens maken we gebruik van de detecteren () methode om het type op te lossen:

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

De bibliotheek vertrouwt op magische markeringen in het streamvoorvoegsel, voor typeresolutie.

7. Conclusie

In dit artikel hebben we de verschillende strategieën bekeken om het MIME-bestandstype te verkrijgen. Bovendien hebben we ook de afwegingen van de benaderingen geanalyseerd. We hebben ook gewezen op de scenario's waarin we de ene strategie boven de andere zouden moeten verkiezen.

De volledige broncode die in dit artikel wordt gebruikt, is zoals altijd beschikbaar op GitHub.