go get github.com/gabriel-vasile/mimetype
mtype := mimetype . Detect ([] byte )
// OR
mtype , err := mimetype . DetectReader ( io . Reader )
// OR
mtype , err := mimetype . DetectFile ( "/path/to/file" )
fmt . Println ( mtype . String (), mtype . Extension ())
Lihat contoh Go Playground yang dapat dijalankan.
Hanya gunakan perpustakaan seperti mimetype sebagai pilihan terakhir. Deteksi tipe konten menggunakan angka ajaib lambat, tidak akurat, dan tidak standar. Seringkali protokol memiliki metode untuk menentukan metadata tersebut; misalnya, header Content-Type
di HTTP dan SMTP.
T: File saya ada dalam daftar tipe MIME yang didukung tetapi tidak terdeteksi dengan benar. Apa yang harus saya lakukan?
J: Beberapa format file (seringkali dokumen Microsoft Office) menyimpan tanda tangannya di akhir file. Coba tingkatkan jumlah byte yang digunakan untuk deteksi dengan:
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
Jika peningkatan batas tidak membantu, silakan buka terbitan.
mimetype menggunakan struktur hierarki untuk menjaga logika deteksi tipe MIME. Hal ini mengurangi jumlah panggilan yang diperlukan untuk mendeteksi jenis file. Alasan di balik pilihan ini adalah karena terdapat format file yang digunakan sebagai wadah untuk format file lainnya. Misalnya, file Microsoft Office hanyalah arsip zip yang berisi file metadata tertentu. Setelah file diidentifikasi sebagai zip, tidak perlu memeriksa apakah itu file teks, tetapi ada baiknya memeriksa apakah itu file Microsoft Office.
Untuk mencegah memuat seluruh file ke dalam memori, ketika mendeteksi dari pembaca atau dari file, mimetype membatasi dirinya untuk hanya membaca header input.
Berkat struktur hierarki, mencari format umum terlebih dahulu, dan membatasi dirinya pada header file, mimetype cocok dengan kinerja stdlib http.DetectContentType
sekaligus mengungguli paket alternatif.
mimetype http.DetectContentType filetype
BenchmarkMatchTar-24 250 ns/op 400 ns/op 3778 ns/op
BenchmarkMatchZip-24 524 ns/op 351 ns/op 4884 ns/op
BenchmarkMatchJpeg-24 103 ns/op 228 ns/op 839 ns/op
BenchmarkMatchGif-24 139 ns/op 202 ns/op 751 ns/op
BenchmarkMatchPng-24 165 ns/op 221 ns/op 1176 ns/op
Lihat KONTRIBUSI.md.