web-dev-qa-db-fra.com

Comment déterminer l'extension de fichier appropriée à partir du type MIME dans Java

Je télécharge des fichiers vers un compartiment Amazon s3 et j'ai accès à InputStream et à une chaîne contenant le type MIME du fichier mais pas le nom de fichier d'origine. C'est à moi de créer le nom et l'extension du fichier avant de pousser le fichier vers S3. Existe-t-il une bibliothèque ou un moyen pratique pour déterminer l'extension appropriée à utiliser à partir du type MIME?

J'ai vu quelques références à la bibliothèque Apache Tika, mais cela semble exagéré et je n'ai pas encore pu l'obtenir pour détecter avec succès les extensions de fichier. D'après ce que j'ai pu recueillir, il semble que ce code devrait fonctionner, mais je reçois juste une chaîne vide lorsque ma variable de type est "image/jpeg"

    MimeType mimeType = null;
    try {
        mimeType = new MimeTypes().forName(type);
    } catch (MimeTypeException e) {
        Logger.error("Couldn't Detect Mime Type for type: " + type, e);
    }

    if (mimeType != null) {
        String extension = mimeType.getExtension();
        //do something with the extension
    }
29
rphutchinson

Comme certains commentateurs l'ont souligné, il n'y a pas de mappage universel 1: 1 entre les types MIME et les extensions de fichier ... Certains types MIME ont plus d'une extension possible, de nombreuses extensions sont partagées par plusieurs types MIME et certains types MIME n'ont pas d'extension.

Dans la mesure du possible, vous feriez bien mieux de stocker le type MIME et de l'utiliser à l'avenir, et d'oublier l'extension.

Cela dit, si vous voulez obtenir l'extension de fichier la plus courante pour un type de mime donné, alors Tika est un bon moyen d'aller. Apache Tika possède un très grand ensemble de types MIME qu'il connaît, et pour beaucoup d'entre eux, il connaît également la magie du mime pour la détection, les extensions communes, les descriptions, etc.

Si vous voulez obtenir l'extension la plus courante pour un fichier JPEG, alors comme indiqué dans ce test unitaire Apache Tika il vous suffit de faire quelque chose comme:

  MimeTypes allTypes = MimeTypes.getDefaultMimeTypes();
  MimeType jpeg = allTypes.forName("image/jpeg");
  String jpegExt = jpeg.getExtension(); // .jpg
  assertEquals(".jpg", jpeg.getExtension());

L'essentiel est que vous devez charger le fichier xml fourni dans le pot Tika pour obtenir les définitions de tous les types MIME. Si vous avez peut-être aussi affaire à des mimetypes personnalisés, alors Tika les prend en charge et changez la première ligne comme suit:

  TikaConfig config = TikaConfig.getDefaultConfig();
  MimeTypes allTypes = config.getMimeRepository();

En utilisant la méthode TikaConfig pour obtenir les MimeTypes, Tika vérifiera également votre chemin de classe pour les définitions de type MIME personnalisées et les inclura également.

48
Gagravarr