首頁 >後端開發 >C++ >如何使用.NET中的簽名來確定文件的MIME類型?

如何使用.NET中的簽名來確定文件的MIME類型?

DDD
DDD原創
2025-01-31 15:01:09723瀏覽

How to Determine a File's MIME Type Using its Signature in .NET?

通過文件簽名在.NET中確定MIME類型

.NET框架提供了一種基於文件簽名而非擴展名識別文件MIME類型的方法。這在處理擴展名不正確或缺失的文件時特別有用。

要確定MIME類型,您可以利用urlmon.dll導出的FindMimeFromData函數。此函數接收表示文件簽名的字節緩衝區,並返回其MIME類型。

以下是一個演示如何使用此函數的代碼示例:

<code class="language-csharp">using System.Runtime.InteropServices;
...

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private 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 dwReserverd
);

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

    byte[] buffer = new byte[256];
    using (FileStream fs = new FileStream(filename, FileMode.Open))
    {
        int bytesRead = fs.Read(buffer, 0, 256); // Read at most 256 bytes
        if (bytesRead < 256)
        {
            Array.Resize(ref buffer, bytesRead); // Resize buffer if less than 256 bytes were read
        }
    }
    try
    {
        uint mimetype;
        FindMimeFromData(0, null, buffer, (uint)buffer.Length, null, 0, out mimetype, 0);
        IntPtr mimeTypePtr = new IntPtr(mimetype);
        string mime = Marshal.PtrToStringUni(mimeTypePtr);
        Marshal.FreeCoTaskMem(mimeTypePtr);
        return mime;
    }
    catch (Exception e)
    {
        return "unknown/unknown";
    }
}</code>

這種方法提供了一種可靠的方法,可以僅根據文件的簽名來獲取其MIME類型,而不管擴展名如何。 代碼改進之處在於更精確地處理讀取的字節數,避免了潛在的數組越界問題。

以上是如何使用.NET中的簽名來確定文件的MIME類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn