通過文件簽名在.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中文網其他相關文章!