Asp.net-Mvc

在 C# 中,如何從 byte[] 中知道文件類型?

  • October 31, 2009

我有一個從上傳的文件填充的字節數組。但是,在程式碼的另一部分,我需要知道從 byte[] 上傳的文件類型,以便將正確的內容類型呈現給瀏覽器!

謝謝!!

不確定,但也許你應該調查一下幻數

更新: 閱讀它,但我認為它不是很可靠。

如前所述,MIME 魔法是做到這一點的唯一方法。許多平台提供了最新且強大的 MIME 魔術文件和程式碼來有效地執行此操作。在沒有任何 3rd 方程式碼的情況下在 .NET 中執行此操作的唯一方法是使用FindMimeFromDataurlmon.dll。這是如何做:

public static int MimeSampleSize = 256;

public static string DefaultMimeType = "application/octet-stream";

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static 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 GetMimeFromBytes(byte[] data) {
   try {
       uint mimeType;
       FindMimeFromData(0, null, data, (uint)MimeSampleSize, null, 0, out mimeType, 0);

       var mimePointer = new IntPtr(mimeType);
       var mime = Marshal.PtrToStringUni(mimePointer);
       Marshal.FreeCoTaskMem(mimePointer);

       return mime ?? DefaultMimeType;
   }
   catch {
       return DefaultMimeType;
   }
}

這使用 Internet Explorer MIME 檢測器。這與 IE 用於發送 MIME 類型和上傳文件的程式碼相同。您可以看到urlmon.dll 支持的 MIME 類型列表image/pjpeg需要注意的一件事是image/x-png哪些是非標準的。在我的程式碼中,我將這些替換為image/jpegand image/png

引用自:https://stackoverflow.com/questions/1654846