Dobivanje MIME tipa datoteke na Javi

1. Pregled

U ovom ćemo uputstvu pogledati razne strategije za dobivanje MIME vrsta datoteke. Istražit ćemo načine kako proširiti MIME vrste dostupne strategijama, gdje god je to primjenjivo.

Također ćemo istaknuti gdje bismo trebali favorizirati jednu strategiju u odnosu na drugu.

2. Korištenje Jave 7

Počnimo s Javom 7 - koja pruža metodu Files.probeContentType (put) za rješavanje MIME tipa:

@Test public void whenUsingJava7_thenSuccess () {Put puta = nova datoteka ("product.png"). ToPath (); Niz mimeType = Files.probeContentType (put); assertEquals (mimeType, "image / png"); } 

Ova metoda koristi instalirano FileTypeDetector implementacije za ispitivanje MIME tipa. Poziva na probeContentType svake implementacije za rješavanje tipa.

Sada, ako je datoteka prepoznata od bilo koje implementacije, vraća se vrsta sadržaja. Međutim, ako se to ne dogodi, poziva se sistemski zadani detektor vrste datoteke.

Međutim, zadane su implementacije specifične za OS i možda neće uspjeti, ovisno o OS-u koji koristimo.

Uz to, također je važno napomenuti da strategija neće uspjeti ako datoteka nije prisutna u datotečnom sustavu. Nadalje, ako datoteka nema nastavak, rezultirat će neuspjehom.

3. Korištenje URLConnection

URLConnection pruža nekoliko API-ja za otkrivanje MIME vrsta datoteke. Istražimo ukratko svaku od njih.

3.1. Koristeći getContentType ()

Možemo koristiti getContentType () metoda URLConnection da biste dohvatili MIME tip datoteke:

@Test public void whenUsingGetContentType_thenSuccess () {Datoteka datoteke = nova datoteka ("product.png"); URLConnection veza = file.toURL (). OpenConnection (); Niz mimeType = connection.getContentType (); assertEquals (mimeType, "image / png"); }

Međutim, glavni nedostatak ovog pristupa je taj vrlo je sporo.

3.2. Koristeći guessContentTypeFromName ()

Dalje, da vidimo kako možemo koristiti guessContentTypeFromName () u svrhu:

@Test public void whenUsingGuessContentTypeFromName_thenSuccess () {Datoteka datoteke = nova datoteka ("product.png"); Niz mimeType = URLConnection.guessContentTypeFromName (file.getName ()); assertEquals (mimeType, "image / png"); }

Ova metoda koristi interno FileNameMap do riješite MIME tip iz proširenja.

Također imamo mogućnost korištenja guessContentTypeFromStream () umjesto toga, koji koristi prvih nekoliko znakova ulaznog toka, za određivanje vrste.

3.3. Koristeći getFileNameMap()

Brži način dobivanja vrste MIME pomoću URLConnection koristi getFileNameMap () metoda:

@Test public void whenUsingGetFileNameMap_thenSuccess () {Datoteka datoteke = nova datoteka ("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap (); Niz mimeType = fileNameMap.getContentTypeFor (file.getName ()); assertEquals (mimeType, "image / png"); }

Metoda vraća tablicu MIME vrsta koje koriste sve instance URLConnection. Ova se tablica zatim koristi za rješavanje vrste ulazne datoteke.

Ugrađena tablica MIME vrsta vrlo je ograničena kad je riječ o URLConnection.

Prema zadanim postavkama, razred koristi content-types.properties uloži u JRE_HOME / lib. Međutim, možemo ga proširiti specificiranjem korisničke tablice pomoću content.types.user.table svojstvo:

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

4. Korištenje MimeTypesFileTypeMap

MimeTypesFileTypeMap rješava MIME vrste pomoću nastavka datoteke. Ova je klasa dolazila s Javom 6 i stoga je vrlo korisna kada radimo s JDK 1.6.

Sada da vidimo kako ga koristiti:

@Test public void whenUsingMimeTypesFileTypeMap_thenSuccess () {Datoteka datoteke = nova datoteka ("product.png"); MimetypesFileTypeMap fileTypeMap = novi MimetypesFileTypeMap (); Niz mimeType = fileTypeMap.getContentType (file.getName ()); assertEquals (mimeType, "image / png"); }

Ovdje možemo proslijediti ime datoteke ili Datoteka sama instanca kao parametar funkcije. Međutim, funkcija sa Datoteka instance jer parametar interno poziva preopterećenu metodu koja prihvaća naziv datoteke kao parametar.

Ova metoda interno traži datoteku pod nazivom mimika.vrste za razlučivost tipa. Vrlo je važno napomenuti da metoda traži datoteku određenim redoslijedom:

  1. Programski dodani unosi u MimetypesFileTypeMap primjer
  2. .mimika.vrste u korisnikovom kućnom direktoriju
  3. /lib/mime.types
  4. resursi imenovani META-INF / mime.vrste
  5. resurs imenovan META-INF / mimetypes.default (obično se nalazi samo u aktivacija.jar datoteka)

Međutim, ako nije pronađena datoteka, vratit će se aplikacija / oktet-tok kao odgovor.

5. Korištenje jMimeMagic

jMimeMagic je ograničeno licencirana knjižnica koju možemo koristiti za dobivanje MIME vrste datoteke.

Počnimo s konfiguriranjem ovisnosti Maven:

 net.sf.jmimemagic jmimemagic 0.1.5 

Najnoviju verziju ove knjižnice možemo pronaći na Maven Central.

Dalje ćemo istražiti kako raditi s knjižnicom:

@Test public void whenUsingJmimeMagic_thenSuccess () {Datoteka datoteke = nova datoteka ("product.png"); Čarobna magija = nova Magija (); MagicMatch match = magic.getMagicMatch (datoteka, netačno); assertEquals (match.getMimeType (), "image / png"); }

Ova knjižnica može raditi s protokom podataka i stoga ne zahtijeva da datoteka bude prisutna u datotečnom sustavu.

6. Korištenje Apache Tika

Apache Tika skup je alata koji otkriva i izdvaja metapodatke i tekst iz različitih datoteka. Ima bogat i moćan API, a dolazi s tika-core-om koju možemo iskoristiti za otkrivanje MIME vrste datoteke.

Počnimo s konfiguriranjem ovisnosti Maven:

 org.apache.tika tika-core 1.18 

Dalje ćemo iskoristiti otkriti() metoda za rješavanje tipa:

@Test public void whenUsingTika_thenSuccess () {Datoteka datoteke = nova datoteka ("product.png"); Tika tika = nova Tika (); Niz mimeType = tika.detect (datoteka); assertEquals (mimeType, "image / png"); }

Biblioteka se za razlučivanje tipa oslanja na čarobne markere u prefiksu streama.

7. Zaključak

U ovom smo članku pogledali različite strategije dobivanja MIME vrste datoteke. Nadalje, također smo analizirali kompromise pristupa. Također smo ukazali na scenarije u kojima bismo trebali favorizirati jednu strategiju u odnosu na drugu.

Cjeloviti izvorni kod koji se koristi u ovom članku dostupan je na GitHub-u, kao i uvijek.


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