Mendapatkan Jenis Mime Fail di Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat pelbagai strategi untuk mendapatkan jenis fail MIME. Kami akan mencari cara untuk memperluas jenis MIME yang tersedia untuk strategi, di mana sahaja berlaku.

Kami juga akan menunjukkan di mana kita harus memilih satu strategi daripada strategi yang lain.

2. Menggunakan Java 7

Mari kita mulakan dengan Java 7 - yang menyediakan kaedah Files.probeContentType (jalan) untuk menyelesaikan jenis MIME:

@Test public void whenUsingJava7_thenSuccess() { Path path = new File("product.png").toPath(); String mimeType = Files.probeContentType(path); assertEquals(mimeType, "image/png"); } 

Kaedah ini menggunakan implementasi FileTypeDetector yang dipasang untuk memeriksa jenis MIME. Ia meminta probeContentType setiap pelaksanaan untuk menyelesaikan jenisnya.

Sekarang, jika fail dikenali oleh salah satu pelaksanaan, jenis kandungan dikembalikan. Namun, jika itu tidak berlaku, pengesan jenis fail lalai sistem akan dipanggil.

Walau bagaimanapun, pelaksanaan lalai khusus OS dan mungkin gagal bergantung pada OS yang kita gunakan.

Selain itu, penting juga untuk diperhatikan bahawa strategi akan gagal jika fail tidak ada di sistem fail. Selanjutnya, jika fail tidak mempunyai ekstensi, ia akan mengakibatkan kegagalan.

3. Menggunakan URLConnection

URLConnection menyediakan beberapa API untuk mengesan jenis fail MIME. Mari kita meneroka secara ringkas masing-masing.

3.1. Menggunakan getContentType ()

Kita boleh menggunakan kaedah getContentType () URLConnection untuk mengambil jenis MIME fail:

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

Walau bagaimanapun, kelemahan utama pendekatan ini adalah bahawa ia sangat perlahan .

3.2. Menggunakan menekaContentTypeFromName ()

Seterusnya, mari kita lihat bagaimana kita dapat memanfaatkan estimContentTypeFromName () untuk tujuan:

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

Kaedah ini menggunakan FileNameMap dalaman untuk menyelesaikan jenis MIME dari peluasan .

Kami juga mempunyai pilihan untuk menggunakan guessContentTypeFromStream () , yang menggunakan beberapa watak pertama aliran input, untuk menentukan jenisnya.

3.3. Menggunakan getFileNameMap ()

Cara yang lebih pantas untuk mendapatkan jenis MIME menggunakan URLConnection adalah dengan menggunakan kaedah getFileNameMap () :

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

Kaedah mengembalikan jadual jenis MIME yang digunakan oleh semua kejadian URLConnection. Jadual ini kemudian digunakan untuk menyelesaikan jenis fail input.

Jadual terbina dalam jenis MIME sangat terhad ketika datang ke URLConnection .

Secara lalai, kegunaan kelas content-types.properties fail dalam JRE_HOME / lib . Walau bagaimanapun, kami dapat memperluasnya, dengan menentukan jadual khusus pengguna menggunakan sifat content.types.user.table :

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

4. Menggunakan MimeTypesFileTypeMap

MimeTypesFileTypeMap menyelesaikan jenis MIME dengan menggunakan peluasan fail. Kelas ini dilengkapi dengan Java 6, dan oleh itu sangat berguna semasa kami bekerja dengan JDK 1.6.

Sekarang mari kita lihat cara menggunakannya:

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

Di sini, kita boleh meneruskan nama fail atau contoh fail itu sendiri sebagai parameter ke fungsi. Namun, fungsi dengan Instance file sebagai parameter secara internal memanggil metode overloaded yang menerima nama file sebagai parameter.

Secara dalaman, kaedah ini mencari fail bernama mime.types untuk resolusi jenis. Sangat penting untuk diperhatikan bahawa kaedah mencari fail dalam urutan tertentu:

  1. Entri yang ditambahkan secara terprogram ke instance MimetypesFileTypeMap
  2. . mime.type dalam direktori utama pengguna
  3. /lib/mime.types
  4. sumber bernama META-INF / mime.types
  5. sumber bernama META-INF / mimetypes.default (biasanya hanya terdapat dalam fail activation.jar )

Namun, jika tidak ada fail yang dijumpai, file akan mengembalikan aliran aplikasi / octet sebagai respons.

5. Menggunakan jMimeMagic

jMimeMagic adalah perpustakaan berlesen yang boleh kita gunakan untuk mendapatkan jenis fail MIME.

Mari mulakan dengan mengkonfigurasi kebergantungan Maven:

 net.sf.jmimemagic jmimemagic 0.1.5 

Kita boleh mendapatkan versi terbaru perpustakaan ini di Maven Central.

Seterusnya, kami akan meneroka cara bekerja dengan perpustakaan:

@Test public void whenUsingJmimeMagic_thenSuccess() { File file = new File("product.png"); Magic magic = new Magic(); MagicMatch match = magic.getMagicMatch(file, false); assertEquals(match.getMimeType(), "image/png"); }

Perpustakaan ini dapat berfungsi dengan aliran data dan karenanya tidak memerlukan file tersebut ada dalam sistem file.

6. Menggunakan Apache Tika

Apache Tika adalah set alat yang mengesan dan mengekstrak metadata dan teks dari pelbagai fail. Ini memiliki API yang kaya dan kuat dan dilengkapi dengan tika-core yang dapat kita gunakan, untuk mengesan jenis fail MIME.

Mari mulakan dengan mengkonfigurasi kebergantungan Maven:

 org.apache.tika tika-core 1.18 

Seterusnya, kami akan menggunakan kaedah deteksi () untuk menyelesaikan jenisnya:

@Test public void whenUsingTika_thenSuccess() { File file = new File("product.png"); Tika tika = new Tika(); String mimeType = tika.detect(file); assertEquals(mimeType, "image/png"); }

Perpustakaan bergantung pada penanda sihir di awalan aliran, untuk penyelesaian jenis.

7. Kesimpulannya

Dalam artikel ini, kami telah melihat pelbagai strategi untuk mendapatkan jenis fail MIME. Selanjutnya, kami juga telah menganalisis pertukaran pendekatan. Kami juga menunjukkan senario di mana kita harus memilih satu strategi daripada strategi yang lain.

Kod sumber penuh yang digunakan dalam artikel ini tersedia di GitHub, seperti biasa.