Saya hanya ingin tahu bagaimana kebanyakan orang mengambil tipe mime dari sebuah file di Java? Sejauh ini saya sudah mencoba dua utilities: JMimeMagic
& Mime-Util
.
Yang pertama memberi saya pengecualian memori, yang kedua tidak menutup alirannya dengan benar. Saya hanya ingin tahu apakah ada orang lain yang memiliki metode / perpustakaan yang mereka gunakan dan bekerja dengan benar?
Jawaban:
Di Java 7 sekarang Anda bisa menggunakannya
Files.probeContentType(path)
.sumber
null
keluar untuk.xml
,.png
dan.xhtml
file. Saya tidak tahu apakah saya hanya melakukan sesuatu yang sangat salah, tetapi itu agak mengerikan.Sayangnya,
tidak berfungsi, karena penggunaan URL ini membuat file terkunci, sehingga, misalnya, tidak dapat dihapus.
Namun, Anda memiliki ini:
dan juga yang berikut, yang memiliki keuntungan melampaui penggunaan ekstensi file belaka, dan mengintip konten
Namun, seperti yang disarankan oleh komentar di atas, tabel bawaan tipe mime cukup terbatas, tidak termasuk, misalnya, MSWord dan PDF. Jadi, jika Anda ingin menggeneralisasi, Anda harus melampaui pustaka built-in, menggunakan, misalnya, Mime-Util (yang merupakan pustaka hebat, menggunakan ekstensi file dan konten).
sumber
FileInputStream
keBufferedInputStream
merupakan bagian penting - jika tidakguessContentTypeFromStream
kembalinull
(lulusInputStream
misalnya harus mendukung tanda)URLConnection
memiliki satu set tipe konten yang sangat terbatas yang dikenali. Misalnya tidak dapat dideteksiapplication/pdf
.guessContentTypeFromName()
menggunakan$JAVA_HOME/lib/content-types.properties
file default . Anda dapat menambahkan file Anda sendiri dengan mengubah properti sistemSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
API JAF adalah bagian dari JDK 6. Lihat
javax.activation
paket.Kelas yang paling menarik adalah
javax.activation.MimeType
- pemegang tipe MIME aktual - danjavax.activation.MimetypesFileTypeMap
- kelas yang instansinya dapat menyelesaikan tipe MIME sebagai String untuk file:sumber
getContentType(File)
negara: Mengembalikan tipe MIME dari objek file. Implementasinya di kelas ini memanggilgetContentType(f.getName())
.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
Dengan Apache Tika Anda hanya perlu tiga baris kode :
Jika Anda memiliki konsol asyik, cukup rekatkan dan jalankan kode ini untuk bermain dengannya:
Perlu diingat bahwa API-nya kaya, ia dapat menguraikan "apa saja". Pada tika-core 1.14, Anda memiliki:
Lihat apidocs untuk informasi lebih lanjut.
sumber
new Tika().detect(file.toPath())
untuk deteksi berbasis ekstensi file daripada deteksi berdasarkan konten filenew Tika().detect(file.getPath())
, yang hanya menggunakan ekstensi fileApache Tika menawarkan di tika-core deteksi tipe mime berdasarkan marka sihir pada awalan stream.
tika-core
tidak mengambil dependensi lain, yang membuatnya seringan Utilitas Deteksi Tipe Mime yang saat ini tidak terawat .Contoh kode sederhana (Java 7), menggunakan variabel
theInputStream
dantheFileName
Harap dicatat bahwa MediaType.detect (...) tidak dapat digunakan secara langsung ( TIKA-1120 ). Petunjuk lainnya disediakan di https://tika.apache.org/0.10/detection.html .
sumber
Metadata.RESOURCE_NAME_KEY
dapat dihilangkan (jika Anda tidak memiliki atau tidak dapat mengandalkan nama asli), tetapi dalam hal ini Anda akan mendapatkan hasil yang salah dalam beberapa kasus (misalnya dokumen kantor).Jika Anda seorang pengembang Android, Anda dapat menggunakan kelas utilitas
android.webkit.MimeTypeMap
yang memetakan tipe-MIME untuk mengajukan ekstensi dan sebaliknya.Cuplikan kode berikut dapat membantu Anda.
sumber
Dari roseindia :
sumber
Jika Anda terjebak dengan java 5-6 maka kelas utilitas ini dari produk open source servoy .
Anda hanya perlu fungsi ini
Ini menyelidiki byte pertama dari konten dan mengembalikan tipe konten berdasarkan konten itu dan bukan dengan ekstensi file.
sumber
Saya telah menerbitkan SimpleMagic saya paket Java yang memungkinkan penentuan tipe-tipe (tipe-mime) dari file dan byte array. Ini dirancang untuk membaca dan menjalankan file Unix (1) perintah file ajaib yang merupakan bagian dari sebagian besar ~ konfigurasi OS Unix.
Saya mencoba Apache Tika tetapi sangat besar dengan banyak dependensi,
URLConnection
tidak menggunakan byte file, danMimetypesFileTypeMap
juga hanya melihat nama file.Dengan SimpleMagic Anda dapat melakukan sesuatu seperti:
sumber
Untuk mengimbangi 5 sen saya:
TL, DR
Saya menggunakan MimetypesFileTypeMap dan menambahkan mime yang tidak ada di sana dan saya secara khusus membutuhkannya, ke dalam file mime.types.
Dan sekarang, yang lama dibaca:
Pertama-tama, daftar jenis MIME sangat besar , lihat di sini: https://www.iana.org/assignments/media-types/media-types.xhtml
Saya suka menggunakan fasilitas standar yang disediakan oleh JDK terlebih dahulu, dan jika itu tidak berhasil, saya akan pergi dan mencari yang lain.
Tentukan jenis file dari ekstensi file
Sejak 1.6, Java memiliki MimetypesFileTypeMap, seperti yang ditunjukkan dalam salah satu jawaban di atas, dan ini adalah cara paling sederhana untuk menentukan tipe mime:
Dalam implementasi vanilla ini tidak banyak membantu (yaitu berfungsi untuk .html tetapi tidak untuk .png). Namun, sangat sederhana untuk menambahkan jenis konten apa pun yang Anda butuhkan:
Contoh entri untuk file png dan js adalah:
Untuk format file mime.types, lihat detail lebih lanjut di sini: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Tentukan jenis file dari konten file
Sejak 1.7, Java memiliki java.nio.file.spi.FileTypeDetector , yang mendefinisikan API standar untuk menentukan tipe file dalam implementasi yang spesifik .
Untuk mengambil tipe mime untuk file, Anda cukup menggunakan File dan melakukan ini dalam kode Anda:
Definisi API menyediakan fasilitas yang mendukung untuk menentukan jenis pantomim file dari nama file atau dari konten file (byte ajaib). Itu sebabnya probeContentType () metode melempar IOException, jika implementasi API ini menggunakan Path yang disediakan untuk benar-benar mencoba membuka file yang terkait dengannya.
Sekali lagi, implementasi vanilla ini (yang datang dengan JDK) meninggalkan banyak hal yang diinginkan.
Di beberapa dunia ideal di galaksi yang sangat jauh, semua pustaka yang mencoba memecahkan masalah tipe file-to-mime ini hanya akan mengimplementasikan java.nio.file.spi.FileTypeDetector , Anda akan memasukkan jar perpustakaan implementasi yang disukai file ke classpath Anda dan hanya itu.
Di dunia nyata, bagian tempat Anda membutuhkan TL, DR, Anda harus menemukan perpustakaan dengan sebagian besar bintang di sebelah namanya dan menggunakannya. Untuk kasus khusus ini, saya tidak perlu satu (belum;)).
sumber
Saya mencoba beberapa cara untuk melakukannya, termasuk yang pertama dikatakan oleh @ Yosua Fox. Tetapi beberapa tidak mengenali mimetipe seperti untuk file PDF, dan lainnya tidak dapat dipercaya dengan file palsu (saya mencoba dengan file RAR dengan ekstensi diubah menjadi TIF). Solusi yang saya temukan, seperti juga dikatakan oleh @Joshua Fox dengan cara yang dangkal, adalah dengan menggunakan MimeUtil2 , seperti ini:
sumber
Lebih baik menggunakan validasi dua lapisan untuk mengunggah file.
Pertama, Anda dapat memeriksa mimeType dan memvalidasinya.
Kedua Anda harus melihat untuk mengkonversi 4 byte pertama dari file Anda ke heksadesimal dan kemudian membandingkannya dengan angka ajaib. Maka itu akan menjadi cara yang sangat aman untuk memeriksa validasi file.
sumber
Ini adalah cara paling sederhana yang saya temukan untuk melakukan ini:
sumber
Jika Anda bekerja dengan Servlet dan jika konteks servlet tersedia untuk Anda, Anda dapat menggunakan:
sumber
getServletContext
?dalam file MultipartFile musim semi ;
file.getContentType();
sumber
jika Anda bekerja di OS linux, ada baris perintah
file --mimetype
:Kemudian
sumber
Setelah mencoba berbagai pustaka lain saya puas dengan mime-util.
sumber
sumber
Anda dapat melakukannya hanya dengan satu baris: MimetypesFileTypeMap (). GetContentType (File baru ("filename.ext")) . Lihat kode tes lengkap (Java 7):
Kode ini menghasilkan output sebagai berikut: teks / polos
sumber
sumber
Saya melakukannya dengan kode berikut.
sumber
Apache Tika.
dan Dua baris kode.
Tangkapan layar di bawah
sumber