Mendapatkan Jenis Mime File di Java

1. Ikhtisar

Dalam tutorial ini, kita akan melihat berbagai strategi untuk mendapatkan jenis file MIME. Kami akan mencari cara untuk memperluas tipe MIME yang tersedia untuk strategi, dimanapun berlaku.

Kami juga akan menunjukkan di mana kami harus mengutamakan satu strategi daripada yang lain.

2. Menggunakan Java 7

Mari kita mulai dengan Java 7 - yang menyediakan metode Files.probeContentType (path) untuk menyelesaikan tipe MIME:

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

Metode ini memanfaatkan implementasi FileTypeDetector yang diinstal untuk menyelidiki jenis MIME. Ini memanggil probeContentType dari setiap implementasi untuk menyelesaikan tipe.

Sekarang, jika file dikenali oleh salah satu implementasi, tipe konten dikembalikan. Namun, jika itu tidak terjadi, detektor jenis file default sistem akan dipanggil.

Namun, implementasi default adalah OS khusus dan mungkin gagal tergantung pada OS yang kita gunakan.

Selain itu, penting juga untuk diperhatikan bahwa strategi akan gagal jika file tidak ada di sistem file. Selanjutnya, jika file tersebut tidak memiliki ekstensi, maka akan mengakibatkan kegagalan.

3. Menggunakan URLConnection

URLConnection menyediakan beberapa API untuk mendeteksi jenis MIME file. Mari kita jelajahi secara singkat masing-masing.

3.1. Menggunakan getContentType ()

Kita bisa menggunakan metode getContentType () dari URLConnection untuk mengambil jenis MIME file:

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

Namun, kelemahan utama dari pendekatan ini adalah sangat lambat .

3.2. Menggunakan guessContentTypeFromName ()

Selanjutnya, mari kita lihat bagaimana kita dapat menggunakan guessContentTypeFromName () untuk tujuan tersebut:

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

Metode ini menggunakan FileNameMap internal untuk menyelesaikan jenis MIME dari ekstensi .

Kami juga memiliki opsi untuk menggunakan guessContentTypeFromStream () sebagai gantinya, yang menggunakan beberapa karakter pertama dari aliran input, untuk menentukan jenisnya.

3.3. Menggunakan getFileNameMap ()

Cara yang lebih cepat untuk mendapatkan tipe MIME menggunakan URLConnection adalah menggunakan metode 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"); }

Metode ini mengembalikan tabel tipe MIME yang digunakan oleh semua instance URLConnection. Tabel ini kemudian digunakan untuk menyelesaikan jenis file masukan.

Tabel tipe MIME bawaan sangat terbatas dalam hal URLConnection .

Secara default, kelas menggunakan file content-types.properties di JRE_HOME / lib . Namun, kita dapat memperluasnya, dengan menentukan tabel khusus pengguna menggunakan properti content.types.user.table :

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

4. Menggunakan MimeTypesFileTypeMap

MimeTypesFileTypeMap menyelesaikan jenis MIME dengan menggunakan ekstensi file. Kelas ini hadir dengan Java 6, dan karenanya sangat berguna saat kita 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 dapat mengirimkan nama file atau instance File itu sendiri sebagai parameter ke fungsi. Namun, fungsi dengan instance File sebagai parameter secara internal memanggil metode kelebihan beban yang menerima nama file sebagai parameter.

Secara internal, metode ini mencari file bernama mime.types untuk resolusi tipe. Sangat penting untuk diperhatikan bahwa metode mencari file dalam urutan tertentu:

  1. Entri yang ditambahkan secara terprogram ke instance MimetypesFileTypeMap
  2. . mime.types di direktori home pengguna
  3. /lib/mime.types
  4. sumber daya bernama META-INF / mime.types
  5. sumber daya bernama META-INF / mimetypes.default (biasanya hanya ditemukan di file activation.jar )

Namun, jika tidak ada file yang ditemukan, itu akan mengembalikan application / octet-stream sebagai responsnya.

5. Menggunakan jMimeMagic

jMimeMagic adalah pustaka berlisensi terbatas yang dapat kita gunakan untuk mendapatkan jenis file MIME.

Mari kita mulai dengan mengonfigurasi ketergantungan Maven:

 net.sf.jmimemagic jmimemagic 0.1.5 

Kami dapat menemukan versi terbaru dari perpustakaan ini di Maven Central.

Selanjutnya, kita akan mempelajari 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"); }

Pustaka ini dapat bekerja dengan aliran data dan karenanya tidak memerlukan file untuk ada di sistem file.

6. Menggunakan Apache Tika

Apache Tika adalah perangkat yang mendeteksi dan mengekstrak metadata dan teks dari berbagai file. Ini memiliki API yang kaya dan kuat dan dilengkapi dengan tika-core yang dapat kita gunakan, untuk mendeteksi jenis file MIME.

Mari kita mulai dengan mengonfigurasi ketergantungan Maven:

 org.apache.tika tika-core 1.18 

Selanjutnya, kita akan menggunakan metode detect () untuk menyelesaikan tipe:

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

Pustaka mengandalkan penanda ajaib di awalan aliran, untuk resolusi jenis.

7. Kesimpulan

Di artikel ini, kita telah melihat berbagai strategi untuk mendapatkan tipe MIME dari sebuah file. Selanjutnya, kami juga telah menganalisis pengorbanan dari pendekatan tersebut. Kami juga telah menunjukkan skenario di mana kami harus lebih menyukai satu strategi daripada yang lain.

Kode sumber lengkap yang digunakan dalam artikel ini tersedia di GitHub, seperti biasa.