基于 .NET 中的签名确定文件 MIME 类型
准确识别文件的 MIME 类型对于正确的处理和操作至关重要。当文件扩展名缺失或不正确时,就必须依靠文件签名来准确确定文件类型。本文探讨如何在 .NET 中实现此功能。
使用 urlmon.dll 的解决方案
提供的解决方案使用 urlmon.dll 库根据文件签名提取 MIME 类型。此方法可以通过以下步骤实现:
导入必要的程序集:
<code class="language-csharp">using System.Runtime.InteropServices;</code>
定义 FindMimeFromData 函数:
<code class="language-csharp">[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 );</code>
创建一个从文件检索 MIME 类型的函数:
<code class="language-csharp">public static string GetMimeFromFile(string filename) { // 为简洁起见,省略文件验证 byte[] buffer = new byte[256]; //... try { uint mimetype; FindMimeFromData(0, null, buffer, 256, 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>
使用 GetMimeFromFile 函数获取 MIME 类型:
<code class="language-csharp">string mimeType = GetMimeFromFile("myfile.unknown");</code>
请注意,上述代码片段中省略了部分代码,例如读取文件的前 256 个字节到 buffer
数组中。 完整的实现需要添加必要的错误处理和文件读取逻辑。 此外,使用 urlmon.dll
的方法可能依赖于操作系统,在不同环境下可能存在兼容性问题。 更稳健的解决方案可能需要考虑使用其他 .NET 库或自行实现文件签名解析。
以上是如何使用.NET中的文件签名确定文件的MIME类型?的详细内容。更多信息请关注PHP中文网其他相关文章!