Obtenir le type Mime d’un fichier en Java

Obtenir le type Mime d’un fichier en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons examiner différentes stratégies pour obtenir les types MIME d'un fichier. Nous examinerons les moyens d'étendre les types MIME disponibles aux stratégies, le cas échéant.

Nous indiquerons également dans quels domaines nous devrions privilégier une stratégie par rapport à l’autre.

2. Utiliser Java 7

Commençons par Java 7 - qui fournit la méthodeFiles.probeContentType(path) pour résoudre le type MIME:

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

    assertEquals(mimeType, "image/png");
}

Cette méthode utilise les implémentations installées deFileTypeDetector pour sonder le type MIME. Il appelle lesprobeContentTypede chaque implémentation pour résoudre le type.

Désormais, si le fichier est reconnu par l'une des implémentations, le type de contenu est renvoyé. Cependant, si cela ne se produit pas, un détecteur de type de fichier par défaut du système est appelé.

Cependant, les implémentations par défaut sont spécifiques au système d'exploitation et peuvent échouer en fonction du système d'exploitation que nous utilisons.

En plus de cela, il est également important de noter que la stratégie échouera si le fichier n’est pas présent dans le système de fichiers. De plus, si le fichier n’a pas d’extension, cela entraînera un échec.

 3. Utilisation deURLConnection

URLConnection fournit plusieurs API pour détecter les types MIME d'un fichier. Explorons brièvement chacun d'eux.

3.1. Utilisation degetContentType()

Nous pouvons utiliser la méthodegetContentType() deURLConnection pour récupérer le type MIME d'un fichier:

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

    assertEquals(mimeType, "image/png");
}

Cependant, un inconvénient majeur de cette approche est queit’s very slow.

3.2. Utilisation deguessContentTypeFromName()

Voyons ensuite comment nous pouvons utiliser lesguessContentTypeFromName() à cette fin:

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

    assertEquals(mimeType, "image/png");
}

Cette méthode utilise lesFileNameMap internes àresolve the MIME type from the extension.

Nous avons également la possibilité d'utiliserguessContentTypeFromStream() à la place, qui utilise les premiers caractères du flux d'entrée, pour déterminer le type.

3.3. Utilisation degetFileNameMap ()

Un moyen plus rapide d'obtenir le type MIME à l'aide deURLConnection consiste à utiliser la méthodegetFileNameMap():

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

La méthode retourne la table des types MIME utilisés par toutes les instances deURLConnection. Cette table est ensuite utilisée pour résoudre le type de fichier d'entrée.

La table intégrée des types MIME est très limitée en ce qui concerneURLConnection.

Par défaut,the class uses content-types.properties fichier enJRE_HOME/lib. We can, however, extend it, by specifying a user-specific table using the content.types.user.table property:

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

4. Utilisation deMimeTypesFileTypeMap

MimeTypesFileTypeMap résout les types MIME en utilisant l'extension de fichier. Cette classe est fournie avec Java 6 et est donc très pratique lorsque nous travaillons avec JDK 1.6.

Voyons maintenant comment l'utiliser:

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

Ici, nous pouvons soit passer le nom du fichier, soit l'instanceFile elle-même comme paramètre de la fonction. Cependant, la fonction avec l'instanceFile comme paramètre appelle en interne la méthode surchargée qui accepte le nom de fichier comme paramètre.

En interne, cette méthode recherche un fichier appelémime.types pour la résolution de type. Il est très important de noter que la méthode recherche le fichier dans un ordre spécifique:

  1. Entrées ajoutées par programme à l'instanceMimetypesFileTypeMap

  2. .mime.types dans le répertoire personnel de l'utilisateur

  3. /lib/mime.types

  4. ressources nomméesMETA-INF/mime.types

  5. ressource nomméeMETA-INF/mimetypes.default (généralement trouvée uniquement dans le fichieractivation.jar)

Cependant, si aucun fichier n'est trouvé, il renverraapplication/octet-stream comme réponse.

5. Utilisation de jMimeMagic

jMimeMagic est une bibliothèque sous licence restrictive que nous pouvons utiliser pour obtenir le type MIME d'un fichier.

Commençons par configurer la dépendance Maven:


    net.sf.jmimemagic
    jmimemagic
    0.1.5

Nous pouvons trouver la dernière version de cette bibliothèque surMaven Central.

Ensuite, nous allons explorer comment utiliser la bibliothèque:

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

Cette bibliothèque peut fonctionner avec un flux de données et ne nécessite donc pas que le fichier soit présent dans le système de fichiers.

6. Utilisation d'Apache Tika

Apache Tika est un ensemble d'outils qui détecte et extrait les métadonnées et le texte d'une variété de fichiers. Il a une API riche et puissante et est livré avectika-core que nous pouvons utiliser pour détecter le type MIME d'un fichier.

Commençons par configurer la dépendance Maven:


    org.apache.tika
    tika-core
    1.18

Ensuite, nous utiliserons la méthodedetect() pour résoudre le type:

@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 bibliothèque s'appuie sur des marqueurs magiques dans le préfixe du flux, pour la résolution de type.

7. Conclusion

Dans cet article, nous avons examiné les différentes stratégies d'obtention du type MIME d'un fichier. En outre, nous avons également analysé les compromis des approches. Nous avons également indiqué les scénarios dans lesquels nous devrions privilégier une stratégie par rapport à une autre.

Le code source complet utilisé dans cet article est disponibleover at GitHub, comme toujours.