A fájl MIME típusának megszerzése Java-ban
1. Áttekintés
Ebben az oktatóanyagban megvizsgáljuk a fájl MIME-típusainak megszerzésére vonatkozó különféle stratégiákat. Megvizsgáljuk a rendelkezésre álló MIME-típusok kiterjesztését a stratégiákra, ahol csak lehetséges.
Arra is felhívjuk a figyelmet, hogy hol kellene előnyben részesítenünk az egyik stratégiát a másikkal szemben.
2. A Java 7 használata
Kezdjük a Java 7-tel - amely biztosítja a módszert Files.probeContentType (elérési út) a MIME típus feloldásához:
@Test public void whenUsingJava7_thenSuccess () {Path path = new File ("product.png"). ToPath (); String mimeType = Files.probeContentType (elérési út); assertEquals (mimeType, "image / png"); }
Ez a módszer a telepítetteket használja FileTypeDetector megvalósítások a MIME típusának vizsgálatára. Felhívja a probeContentType az egyes megvalósításokból a típus megoldásához.
Most, ha a fájlt bármelyik megvalósítás felismeri, a tartalom típusa visszaküldik. Ha azonban ez nem történik meg, akkor a rendszer alapértelmezett fájltípus-érzékelőt hívja meg.
Az alapértelmezett megvalósítások azonban operációs rendszer-specifikusak, és a használt operációs rendszertől függően meghiúsulhatnak.
Emellett azt is fontos megjegyezni, hogy a stratégia kudarcot vall, ha a fájl nincs a fájlrendszerben. Továbbá, ha a fájlnak nincs kiterjesztése, az meghibásodást eredményez.
3. Használata URLConnection
URLConnection számos API-t biztosít a fájl MIME-típusainak felderítésére. Fedezzük fel röviden mindegyiket.
3.1. Használata getContentType ()
Tudjuk használni getContentType () a metódusa URLConnection a fájl MIME típusának lekéréséhez:
@Test public void whenUsingGetContentType_thenSuccess () {File file = new File ("product.png"); URLConnection kapcsolat = file.toURL (). OpenConnection (); Karakterlánc mimeType = connection.getContentType (); assertEquals (mimeType, "image / png"); }
Ennek a megközelítésnek azonban az a fő hátránya, hogy nagyon lassú.
3.2. Használata guessContentTypeFromName ()
Ezután nézzük meg, hogyan használhatjuk a guessContentTypeFromName () erre a célra:
@Test public void whenUsingGuessContentTypeFromName_thenSuccess () {File file = new File ("product.png"); Karakterlánc mimeType = URLConnection.guessContentTypeFromName (file.getName ()); assertEquals (mimeType, "image / png"); }
Ez a módszer használja a belső FileNameMap nak nek oldja meg a MIME típust a kiterjesztésből.
Lehetőségünk van a használatra is guessContentTypeFromStream () ehelyett a bemeneti adatfolyam első néhány karakterét használja a típus meghatározásához.
3.3. Használata getFileNameMap()
Gyorsabb módja a MIME típus megszerzésének a használatával URLConnection használja a getFileNameMap () módszer:
@Test public void whenUsingGetFileNameMap_thenSuccess () {File file = new File ("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap (); Karakterlánc mimeType = fileNameMap.getContentTypeFor (file.getName ()); assertEquals (mimeType, "image / png"); }
A metódus a MIME-típusok táblázatát adja vissza, amelyet a URLConnection. Ezt a táblázatot használjuk a bemeneti fájltípus feloldására.
A MIME-típusok beépített táblázata nagyon korlátozott URLConnection.
Alapértelmezés szerint, az osztály használja tartalomtípusok.tulajdonságok fájl JRE_HOME / lib. Kiterjeszthetjük azonban úgy, hogy megadunk egy felhasználóspecifikus táblázatot a content.types.user.table ingatlan:
System.setProperty ("content.types.user.table", "");
4. Használata MimeTypesFileTypeMap
MimeTypesFileTypeMap megoldja a MIME típusokat a fájl kiterjesztésével. Ez az osztály Java 6-tal érkezett, és ezért nagyon hasznos, amikor a JDK 1.6-mal dolgozunk.
Most nézzük meg, hogyan kell használni:
@Test public void whenUsingMimeTypesFileTypeMap_thenSuccess () {File file = new File ("product.png"); MimetypesFileTypeMap fileTypeMap = új MimetypesFileTypeMap (); Karakterlánc mimeType = fileTypeMap.getContentType (file.getName ()); assertEquals (mimeType, "image / png"); }
Itt átadhatjuk a fájl nevét vagy a File magát a függvény paramétereként. Azonban a funkció a File például, mivel a paraméter belsőleg meghívja a túlterhelt metódust, amely a fájlnevet fogadja el paraméterként.
Belsőleg ez a módszer megkeres egy fájlt mime.típusok a típusfelbontáshoz. Nagyon fontos megjegyezni, hogy a módszer meghatározott sorrendben keresi a fájlt:
- Programszerűen hozzáadott bejegyzések a MimetypesFileTypeMap példa
- .mime.típusok a felhasználó saját könyvtárában
- /lib/mime.types
- megnevezett erőforrások META-INF / mime.types
- nevű erőforrás META-INF / mimetypes.default (általában csak a aktiválás.jar fájl)
Ha azonban nem található fájl, akkor az visszatér alkalmazás / oktettfolyam válaszként.
5. Használata jMimeMagic
A jMimeMagic egy korlátozottan licencelt könyvtár, amelyet felhasználhatunk egy fájl MIME-típusának megszerzésére.
Kezdjük a Maven-függőség konfigurálásával:
net.sf.jmimemagic jmimemagic 0.1.5
A könyvtár legújabb verzióját a Maven Central oldalon találjuk.
Ezután megvizsgáljuk, hogyan kell működni a könyvtárral:
@Test public void whenUsingJmimeMagic_thenSuccess () {File file = new File ("product.png"); Varázsvarázs = új Varázslat (); MagicMatch match = magic.getMagicMatch (fájl, hamis); assertEquals (match.getMimeType (), "image / png"); }
Ez a könyvtár adatfolyammal képes működni, ezért nem igényli a fájl jelenlétét a fájlrendszerben.
6. Apache Tika használata
Az Apache Tika olyan eszközkészlet, amely metaadatokat és szöveget észlel és kivonatol különféle fájlokból. Gazdag és hatékony API-val rendelkezik, és a mag-maggal érkezik, amelyet felhasználhatunk a fájl MIME-típusának felderítésére.
Kezdjük a Maven-függőség konfigurálásával:
org.apache.tika tika-core 1.18
Ezután felhasználjuk a felismerni() módszer a típus feloldására:
@Test public void whenUsingTika_thenSuccess () {File file = new File ("product.png"); Tika tika = új Tika (); Karakterlánc mimeType = tika.detect (fájl); assertEquals (mimeType, "image / png"); }
A könyvtár az adatfolyam előtag varázsjelzőire támaszkodik a típus felbontása érdekében.
7. Következtetés
Ebben a cikkben megvizsgáltuk a fájl MIME-típusának megszerzésére vonatkozó különféle stratégiákat. Továbbá elemeztük a megközelítések kompromisszumait is. Kiemeltük azokat a forgatókönyveket is, ahol az egyik stratégiát előnyben kell részesítenünk a másikkal szemben.
A cikkben használt teljes forráskód, mint mindig, a GitHub webhelyén érhető el.