通过文件签名在.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中文网其他相关文章!