Saya mencari cara sederhana untuk mendapatkan tipe pantomim di mana ekstensi file tidak benar atau tidak diberikan, sesuatu yang mirip dengan pertanyaan ini hanya di .Net.
c#
mime
mime-types
Richard Gourlay
sumber
sumber
Jawaban:
Di Urlmon.dll, ada fungsi yang disebut
FindMimeFromData
.Dari dokumentasi
Jadi, baca dulu (hingga) 256 byte dari file dan berikan
FindMimeFromData
.sumber
Saya memang menggunakan urlmon.dll pada akhirnya. Saya pikir akan ada cara yang lebih mudah tetapi ini berhasil. Saya menyertakan kode untuk membantu orang lain dan memungkinkan saya menemukannya lagi jika saya membutuhkannya.
...
sumber
Saya telah menemukan solusi hard-coded, saya harap saya akan membantu seseorang:
sumber
StringComparer.OrdinalIgnoreCase
untuk konstruktor kamus. Perbandingan ordinal lebih cepat daripada invarian, dan Anda akan menyingkirkan.ToLower()
dan variasinya.Sunting: Cukup gunakan Mime Detective
Saya menggunakan urutan array byte untuk menentukan tipe MIME yang benar dari file yang diberikan. Keuntungan dari ini hanya dengan melihat ekstensi file dari nama file adalah bahwa jika pengguna mengubah nama file untuk memotong batasan jenis file tertentu, ekstensi nama file akan gagal untuk menangkap ini. Di sisi lain, mendapatkan tanda tangan file melalui byte array akan menghentikan perilaku nakal ini terjadi.
Berikut adalah contoh dalam C #:
Perhatikan saya menangani tipe file DOCX secara berbeda karena DOCX sebenarnya hanyalah file ZIP. Dalam skenario ini, saya cukup memeriksa ekstensi file setelah saya memverifikasi bahwa ia memiliki urutan itu. Contoh ini jauh dari lengkap untuk beberapa orang, tetapi Anda dapat dengan mudah menambahkan milik Anda sendiri.
Jika Anda ingin menambahkan lebih banyak jenis MIME, Anda bisa mendapatkan urutan array byte dari berbagai jenis file dari sini . Juga, berikut ini adalah sumber yang bagus mengenai tanda tangan file.
Apa yang sering saya lakukan jika semuanya gagal adalah melangkah melalui beberapa file dari jenis tertentu yang saya cari dan mencari pola dalam urutan byte dari file. Pada akhirnya, ini masih verifikasi dasar dan tidak dapat digunakan untuk 100% bukti penentuan jenis file.
sumber
Jika Anda menggunakan .NET Framework 4.5 atau lebih baru, sekarang ada metode MimeMapping.GetMimeMapping (nama file) yang akan mengembalikan string dengan pemetaan Mime yang benar untuk nama file yang diteruskan. Perhatikan bahwa ini menggunakan ekstensi file, bukan data dalam file itu sendiri.
Dokumentasi ada di http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
sumber
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
Anda juga dapat melihat di registri.
Dengan satu atau lain cara Anda harus memanfaatkan basis data MIME - apakah mereka dipetakan dari ekstensi atau angka ajaib agak sepele - registri windows adalah salah satu tempat tersebut. Untuk solusi platform independen, seseorang harus mengirimkan DB ini dengan kode (atau sebagai perpustakaan mandiri).
sumber
Saya menggunakan solusi hybrid:
sumber
.doc
file.HeyRed.Mime.MimeGuesser.GuessMimeType
dari Nuget akan menjadi solusi utama jika Anda ingin meng-host solusi ASP.NET Anda di lingkungan non-windows.Pemetaan ekstensi file sangat tidak aman. Jika penyerang akan mengunggah ekstensi yang tidak valid, kamus pemetaan akan mis. Memungkinkan executable untuk didistribusikan dalam file .jpg. Oleh karena itu, selalu gunakan pustaka sniffing konten untuk mengetahui tipe konten yang sebenarnya.
sumber
Saya pikir jawaban yang tepat adalah kombinasi dari jawaban Steve Morgan dan Serguei. Begitulah Internet Explorer melakukannya. Panggilan pinvoke
FindMimeFromData
hanya berfungsi untuk 26 tipe mime yang dikodekan dengan keras. Juga, itu akan memberikan tipe mime ambigus (sepertitext/plain
atauapplication/octet-stream
) meskipun mungkin ada jenis mime yang lebih spesifik dan lebih tepat. Jika gagal memberikan tipe mime yang baik, Anda bisa pergi ke registri untuk tipe mime yang lebih spesifik. Registri server dapat memiliki lebih banyak tipe mime terbaru.Merujuk ke: http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx
sumber
Kelas ini menggunakan jawaban sebelumnya untuk mencoba dalam 3 cara berbeda: harcoded berdasarkan ekstensi, FindMimeFromData API dan menggunakan registri.
sumber
Saya menemukan ini berguna. Untuk pengembang VB.NET:
sumber
Saya menemukan masalah yang sama dan akhirnya memilih untuk rasa saya sendiri dari solusi Kirk Baucom, ditemukan di sini .
Tampaknya bagi saya bahwa ini adalah kesempatan bagi seseorang untuk menulis layanan pencarian online.
Bagaimanapun, Semoga ini bisa membantu.
sumber
Jika seseorang siap untuk itu mereka bisa port modul perl yang sangat baik File :: Type ke .NET. Dalam kode adalah satu set angka ajaib jumlah header pencarian file untuk setiap jenis file atau regex cocok.
Berikut adalah perpustakaan .NET jenis file mendeteksi http://filetypedetective.codeplex.com/ tetapi hanya mendeteksi sejumlah kecil file saat ini.
sumber
Jawaban ini adalah salinan dari jawaban penulis (Richard Gourlay), tetapi ditingkatkan untuk menyelesaikan masalah pada IIS 8 / win2012 (di mana fungsi akan menyebabkan kumpulan aplikasi mogok), berdasarkan komentar Rohland yang menunjuk ke http://www.pinvoke.net /default.aspx/urlmon.findmimefromdata
...
sumber
@Steve Morgan dan @Richard Gourlay ini adalah solusi yang bagus, terima kasih untuk itu. Satu kekurangan kecil adalah bahwa ketika jumlah byte dalam file adalah 255 atau di bawah, tipe mime kadang-kadang akan menghasilkan "application / octet-stream", yang sedikit tidak akurat untuk file yang diharapkan menghasilkan "text / plain". Saya telah memperbarui metode awal Anda untuk menjelaskan situasi ini sebagai berikut:
Jika jumlah byte dalam file kurang dari atau sama dengan 255 dan tipe mime yang disimpulkan adalah "application / octet-stream", kemudian buat array byte baru yang terdiri dari byte file asli yang diulang n-kali hingga jumlah total byte adalah> = 256. Kemudian periksa kembali tipe mime pada array byte baru itu.
Metode yang dimodifikasi:
sumber
IIS 7 atau lebih
Gunakan kode ini, tetapi Anda harus menjadi admin di server
sumber
Saat bekerja dengan peran Windows Azure Web atau host lain yang menjalankan aplikasi Anda di Limited Trust, jangan lupa bahwa Anda tidak akan diizinkan untuk mengakses registri atau kode yang tidak dikelola. Pendekatan hibrid - kombinasi dari try-catch-for-registry dan di-memory dictionary terlihat seperti solusi yang baik yang memiliki segalanya.
Saya menggunakan kode ini untuk melakukannya:
sumber
Saya akhirnya menggunakan Winista MimeDetector dari Netomatix. Sumber dapat diunduh secara gratis setelah Anda membuat akun: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Ini adalah bagian dari pertanyaan lain yang dijawab di sini: Alternatif metode FindMimeFromData di Urlmon.dll yang memiliki lebih banyak tipe MIME Solusi terbaik untuk masalah ini menurut saya.
sumber
Saya menemukan beberapa masalah dalam menjalankan kode ini:
Jika Anda akan mencoba menjalankannya dengan x64 / Win10, Anda akan mendapatkannya
Berkat posting ini PtrToStringUni tidak berfungsi di windows 10 dan @xanatos
Saya memodifikasi solusi saya untuk berjalan di bawah x64 dan .NET Core 2.1:
Terima kasih
sumber
Halo Saya telah mengadaptasi proyek Winista.MimeDetect ke .net core / framework dengan fallback ke urlmon.dll. Jatuh bebas untuk menggunakannya: paket nuget .
sumber
mimeTypes.GetMimeTypeFromFile(bytes);
Saya menulis validator tipe mime. Silakan berbagi dengan Anda.
sumber