首页 >后端开发 >C++ >如何使用.NET中的签名来确定文件的MIME类型?

如何使用.NET中的签名来确定文件的MIME类型?

DDD
DDD原创
2025-01-31 15:01:09672浏览

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