Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menentukan jenis mime fail di .net, walaupun tanpa sambungan yang sah?

Bagaimanakah saya boleh menentukan jenis mime fail di .net, walaupun tanpa sambungan yang sah?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-31 14:51:12521semak imbas

How Can I Reliably Determine a File's MIME Type in .NET, Even Without a Valid Extension?

Menentukan jenis mime fail dalam .net: memintas isu lanjutan

Cabaran umum dalam pembangunan .NET melibatkan secara tepat mengenal pasti jenis mime fail, terutamanya apabila berurusan dengan fail yang tidak mempunyai sambungan yang betul atau mempunyai yang salah. Ini sering timbul dengan sistem warisan atau aliran data mentah.

Artikel ini membentangkan penyelesaian yang mantap menggunakan kaedah

dari FindMimeFromData. Kaedah ini menganalisis tandatangan fail (256 bait pertama) untuk menentukan jenis mime, memberikan hasil yang boleh dipercayai walaupun tanpa sambungan yang sah. urlmon.dll

Langkah -langkah pelaksanaan:

  1. import : urlmon.dll Gunakan untuk mengimport dll yang diperlukan. System.Runtime.InteropServices
  2. mengisytiharkan : FindMimeFromData Tentukan fungsi luaran . FindMimeFromData
  3. Baca tandatangan fail: Buat fungsi untuk membaca 256 bait awal fail ke dalam array byte. Mengendalikan fail lebih kecil daripada 256 bait dengan anggun.
  4. Panggil : FindMimeFromData Penjagaan kaedah, lulus array byte. Cadangan Jenis MIME memastikan kaedah bergantung semata -mata pada tandatangan fail. null
Contoh Kod:

Coretan kod yang lebih baik ini dengan cekap mengendalikan fail mana -mana saiz dan menyediakan jenis mime "tidak diketahui/tidak diketahui" lalai jika pengesanan gagal. Pendekatan ini memastikan pengenalan jenis mime yang boleh dipercayai, tanpa mengira kesahan sambungan fail.
<code class="language-csharp">using System.Runtime.InteropServices;
using System.IO;

[DllImport("urlmon.dll", CharSet = CharSet.Auto)]
static extern uint FindMimeFromData(uint pBC, [MarshalAs(UnmanagedType.LPStr)] string pwzUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, uint cbSize, [MarshalAs(UnmanagedType.LPStr)] string pwzMimeProposed, uint dwMimeFlags, out uint ppwzMimeOut, uint dwReserved);

public static string GetMimeType(string filePath)
{
    if (!File.Exists(filePath))
        throw new FileNotFoundException($"File not found: {filePath}");

    byte[] buffer = new byte[256];
    using (FileStream fs = new FileStream(filePath, FileMode.Open))
    {
        int bytesRead = fs.Read(buffer, 0, Math.Min(256, (int)fs.Length)); //Handle files < 256 bytes
    }

    uint mimeTypePtr;
    FindMimeFromData(0, null, buffer, (uint)buffer.Length, null, 0, out mimeTypePtr, 0);
    IntPtr ptr = new IntPtr(mimeTypePtr);
    string mimeType = Marshal.PtrToStringUni(ptr);
    Marshal.FreeCoTaskMem(ptr);
    return mimeType ?? "unknown/unknown"; //Handle potential null return
}</code>

Atas ialah kandungan terperinci Bagaimanakah saya boleh menentukan jenis mime fail di .net, walaupun tanpa sambungan yang sah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn