1. Déterminer en fonction de l'extension du fichier
Avantages : Vitesse rapide, code simple
Inconvénients : Impossible de déterminer le type de fichier réel, comme certains faux fichiers ou fichiers sans suffixe.
2. Déterminer en fonction des premiers caractères du flux de fichiers
Avantages : Peut déterminer le type de fichier réel
Inconvénients : Vitesse lente, code complexe
Je vais discuter de chaque méthode ci-dessous , allez tester et vérifier, le fichier de test est le suivant :
test.png : Créez un fichier png normal avec le nom d'extension test.png
test.doc : Copiez le fichier test.png ci-dessus et modifiez-le Son nom de fichier est test.doc
1. À partir de Files.probeContentType
Java1.7, une méthode de résolution des types MIME est fournie Files.probeContentType :
public static void test() throws IOException { Path path = new File("d:/test.png").toPath(); String mimeType = Files.probeContentType(path); System.out.println(mimeType); }
Résultat :
Cette méthode utilise l'implémentation FileTypeDetector installée pour détecter les types MIME. Il appelle le probeContentType de chaque implémentation pour résoudre le type.
Cependant, son implémentation par défaut est spécifique au système d'exploitation et peut échouer en fonction du système d'exploitation que nous utilisons.
Conclusion : jugement basé sur l'extension du fichier.
2. Utilisation d'URLConnection
URLConnection fournit plusieurs API pour détecter le type MIME des fichiers.
2.1 Utilisation de getContentType
public void test(){ File file = new File("d:/test.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); }
Résultat :
Conclusion : jugement basé sur les premiers caractères du flux de fichiers. Capable de déterminer le type réel du fichier, cependant, le principal inconvénient de cette méthode est qu'elle est très lente.
2.2 Utilisez GuessContentTypeFromName
public void test(){ File file = new File("d:/test.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); }
Result :
Cette méthode utilise le FileNameMap interne pour déterminer le type MIME.
Conclusion : jugement basé sur l'extension du fichier.
2.3 Utilisation de GuessContentTypeFromStream
public static void test() throws Exception { FileInputStream inputFile = new FileInputStream("d:/test.doc"); String mimeType = URLConnection.guessContentTypeFromStream(new BufferedInputStream(inputFile)); System.out.println(mimeType); }
Result:
Conclusion : jugement basé sur les premiers caractères du flux de fichiers.
2.4 Utilisation de getFileNameMap
Un moyen plus rapide d'obtenir le type MIME à l'aide d'URLConnection consiste à utiliser la méthode getFileNameMap() :
public void test(){ File file = new File("d:/test.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); }
Result:
Cette méthode renvoie un tableau des types MIME utilisés par toutes les instances de URLConnection . Ce tableau est ensuite utilisé pour analyser les types de fichiers d'entrée.
Le tableau intégré des types MIME est très limité en ce qui concerne URLConnection.
Par défaut, cette classe utilise le fichier content-types.properties et son répertoire est JRE_HOME/lib. Cependant, nous pouvons l'étendre en spécifiant une table spécifique à l'utilisateur à l'aide de la propriété content.types.user.table :
System.setProperty("content.types.user.table","<path-to-file>");</path-to-file>
Conclusion : à en juger par l'extension du fichier.
3. Utilisation de MimeTypesFileTypeMap
Cette classe est livrée avec Java 6, elle est donc très pratique lors de l'utilisation du JDK 1.6.
public void test() { File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); }
Résultat :
Ici, nous pouvons passer le nom du fichier ou l'instance du fichier elle-même en tant que paramètre à la fonction. Cependant, les fonctions qui prennent une instance de File comme argument appellent en interne une méthode surchargée qui accepte un nom de fichier comme argument.
En interne, cette méthode recherche un fichier nommé mime.types pour la résolution de type. Il est important de noter que cette méthode recherche les fichiers dans un ordre spécifique :
Coopération stratégique et co-construction officielle de Hongmeng - Communauté technologique HarmonyOS
Ajoutez par programme des entrées à l'instance MimetypesFileTypeMap
dans le répertoire personnel de l'utilisateur mime.types
Ressource nommée META-INF/mime.types
Ressource nommée META-INF/mimetypes.default (généralement trouvée uniquement dans le fichier activation.jar)
Cependant, si le Le fichier n'est pas trouvé, il renverra application/octet-stream en réponse.
Conclusion : jugement basé sur l'extension du fichier.
4. Utilisation de jmimemagicjMimeMagic
est une bibliothèque à licence restreinte que nous pouvons utiliser pour obtenir le type MIME d'un fichier.
Configuration des dépendances Maven :
<dependency> <groupid>net.sf.jmimemagic</groupid> <artifactid>jmimemagic</artifactid> <version>0.1.5</version> </dependency>
Ensuite, nous explorerons comment utiliser cette bibliothèque :
public void test() { File file = new File("d:/test.doc"); MagicMatch match = Magic.getMagicMatch(file, false); System.out.println(match.getMimeType()); }
Cette bibliothèque peut gérer des flux de données et ne nécessite donc pas que les fichiers existent dans le système de fichiers.
Résultat :
结论:根据文件流中前几个字符判断。
5. 使用Apache TikaApache Tika
是一个工具集,可检测并从各种文件中提取元数据和文本。它具有丰富而强大的API,并带有[tika-core],我们可以利用它来检测文件的MIME类型。
配置Maven依赖:
<dependency> <groupid>org.apache.tika</groupid> <artifactid>tika-core</artifactid> <version>1.18</version> </dependency>
接下来,我们将使用detect()方法来解析类型:
public void whenUsingTika_thenSuccess() { File file = new File("d:/test.doc"); Tika tika = new Tika(); String mimeType = tika.detect(file); }
结果:
结论:根据文件流中前几个字符判断。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!