Získanie typu MIME súboru v jazyku Java

1. Prehľad

V tomto výučbe sa pozrieme na rôzne stratégie na získanie typov súborov MIME. Pozrieme sa na spôsoby, ako rozšíriť typy MIME dostupné pre stratégie, kedykoľvek je to možné.

Poukážeme tiež na to, kde by sme mali uprednostňovať jednu stratégiu pred druhou.

2. Používanie Java 7

Začnime s Java 7 - ktorá poskytuje metódu Files.probeContentType (cesta) pre riešenie typu MIME:

@ Test public void whenUsingJava7_thenSuccess () {Cesta cesty = nový súbor ("product.png"). ToPath (); Reťazec mimeType = Files.probeContentType (cesta); assertEquals (mimeType, "image / png"); } 

Táto metóda využíva nainštalované FileTypeDetector implementácie na sondovanie typu MIME. Vyvoláva to ProbeContentType každej implementácie vyriešiť typ.

Teraz, ak súbor rozpozná niektorá z implementácií, vráti sa typ obsahu. Ak sa tak však nestane, je vyvolaný predvolený systémový typ súboru.

Predvolené implementácie sú však špecifické pre operačný systém a môžu zlyhať v závislosti od operačného systému, ktorý používame.

Okrem toho je tiež dôležité poznamenať, že stratégia zlyhá, ak sa súbor nenachádza v súborovom systéme. Ďalej, ak súbor nemá príponu, bude to mať za následok zlyhanie.

3. Používanie URLConnection

URLConnection poskytuje niekoľko rozhraní API na zisťovanie typov súborov MIME. Poďme krátko preskúmať každú z nich.

3.1. Použitím getContentType ()

Môžeme použiť getContentType () metóda URLConnection načítať typ súboru MIME:

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

Hlavnou nevýhodou tohto prístupu je však to je to veľmi pomalé.

3.2. Použitím guessContentTypeFromName ()

Ďalej sa pozrime, ako môžeme využiť guessContentTypeFromName () na účely:

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

Táto metóda využíva interné FileNameMap do vyriešiť typ MIME z rozšírenia.

Máme tiež možnosť použitia guessContentTypeFromStream () namiesto toho, ktorá používa prvých pár znakov vstupného toku, na určenie typu.

3.3. Použitím getFileNameMap()

Rýchlejší spôsob získania typu MIME pomocou URLConnection používa getFileNameMap () metóda:

@Test public void whenUsingGetFileNameMap_thenSuccess () {File file = new File ("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap (); Reťazec mimeType = fileNameMap.getContentTypeFor (file.getName ()); assertEquals (mimeType, "image / png"); }

Metóda vracia tabuľku typov MIME používaných vo všetkých inštanciách URLConnection. Táto tabuľka sa potom použije na vyriešenie typu vstupného súboru.

Vstavaná tabuľka typov MIME je veľmi obmedzená URLConnection.

Predvolene, trieda používa content-types.properties uložiť v JRE_HOME / lib. Môžeme ju však rozšíriť zadaním tabuľky špecifickej pre používateľa pomocou znaku tabuľka content.types.user.tabuľka nehnuteľnosť:

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

4. Používanie MimeTypesFileTypeMap

MimeTypesFileTypeMap rieši typy MIME pomocou prípony súboru. Táto trieda bola dodaná s jazykom Java 6, a preto prichádza veľmi vhod, keď pracujeme s JDK 1.6.

Teraz sa pozrime, ako ju použiť:

@Test public void whenUsingMimeTypesFileTypeMap_thenSuccess () {File file = new File ("product.png"); MimetypesFileTypeMap fileTypeMap = nový MimetypesFileTypeMap (); Reťazec mimeType = fileTypeMap.getContentType (file.getName ()); assertEquals (mimeType, "image / png"); }

Tu môžeme vložiť buď názov súboru, alebo Súbor inštancia ako parameter funkcie. Funkcia s Súbor inštancia ako parameter interne volá preťaženú metódu, ktorá akceptuje názov súboru ako parameter.

Interne táto metóda vyhľadáva súbor s názvom mime.typy pre rozlíšenie typu. Je veľmi dôležité poznamenať, že metóda vyhľadá súbor v konkrétnom poradí:

  1. Programovo pridané položky do súboru MimetypesFileTypeMap inštancia
  2. .mime.typy v domovskom adresári používateľa
  3. /lib/mime.types
  4. pomenované zdroje META-INF / mime.types
  5. zdroj s názvom META-INF / mimetypes.default (zvyčajne sa nachádzajú iba v activation.jar súbor)

Ak sa však nenájde žiadny súbor, vráti sa aplikácia / oktetový prúd ako odpoveď.

5. Používanie jMimeMagic

jMimeMagic je knižnica s obmedzenou licenciou, ktorú môžeme použiť na získanie typu súboru MIME.

Začnime konfiguráciou závislosti Maven:

 net.sf.jmimemagic jmimemagic 0.1.5 

Najnovšiu verziu tejto knižnice nájdeme na serveri Maven Central.

Ďalej preskúmame, ako pracovať s knižnicou:

@Test public void whenUsingJmimeMagic_thenSuccess () {File file = new File ("product.png"); Magická mágia = nová mágia (); MagicMatch match = magic.getMagicMatch (súbor, nepravda); assertEquals (match.getMimeType (), "obrázok / png"); }

Táto knižnica dokáže pracovať s prúdom údajov, a preto nevyžaduje prítomnosť súboru v systéme súborov.

6. Používanie Apache Tika

Apache Tika je sada nástrojov, ktorá detekuje a extrahuje metadáta a text z rôznych súborov. Má bohaté a výkonné API a dodáva sa s tika-core, ktoré môžeme využiť na detekciu typu súboru MIME.

Začnime konfiguráciou závislosti Maven:

 org.apache.tika tika-core 1.18 

Ďalej využijeme zistiť () metóda na vyriešenie typu:

@Test public void whenUsingTika_thenSuccess () {File file = new File ("product.png"); Tika tika = nová Tika (); Reťazec mimeType = tika.detect (súbor); assertEquals (mimeType, "image / png"); }

Knižnica sa pri rozlišovaní typov spolieha na magické značky v predpone streamu.

7. Záver

V tomto článku sme sa zaoberali rôznymi stratégiami získavania typu súboru MIME. Ďalej sme tiež analyzovali kompromisy prístupov. Poukázali sme tiež na scenáre, v ktorých by sme mali uprednostňovať jednu stratégiu pred druhou.

Celý zdrojový kód, ktorý sa používa v tomto článku, je ako vždy k dispozícii na GitHub.


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