📅  最后修改于: 2023-12-03 14:52:14.547000             🧑  作者: Mango
在网络应用程序开发中,经常需要使用 Base64 编码方式传输文件。在接收方收到 Base64 编码的文件时,如何获取文件类型呢?以下是一些方法:
using System.Web;
string base64 = "data:image/png;base64,iVBORw0KG...";
string mimeType = MimeMapping.GetMimeMapping(base64.Split(',')[0].Split(';')[0].Replace("data:", ""));
这种方法的缺点是它需要 System.Web
命名空间,因此只能在 ASP.NET Web 应用程序中使用。
using System.Collections.Generic;
Dictionary<string, string> mimeTypeMap = new Dictionary<string, string>
{
{ ".bmp", "image/bmp" },
{ ".gif", "image/gif" },
{ ".jpeg", "image/jpeg" },
{ ".jpg", "image/jpeg" },
{ ".png", "image/png" },
{ ".webp", "image/webp" },
{ ".svg", "image/svg+xml" },
{ ".mp3", "audio/mpeg" },
{ ".mp4", "video/mp4" },
{ ".avi", "video/avi" },
// 添加更多的文件扩展名和对应的 MIME 类型
};
string base64 = "data:image/png;base64,iVBORw0KG...";
string extension = "." + base64.Split(',')[0].Split(';')[0].Replace("data:image/", "");
string mimeType = mimeTypeMap.ContainsKey(extension) ? mimeTypeMap[extension] : null;
这种方法的优点是它可以支持更多的文件类型,缺点是需要手动维护映射表。
文件头标识符(File signature,也称为“魔数”)指的是文件中的一组字节,用于识别文件类型。例如,PNG 文件的文件头标识符为 89 50 4E 47 0D 0A 1A 0A
。以下是一些常见的文件类型和对应的文件头标识符:
| 文件类型 | 文件头标识符 |
| -------- | ----------- |
| BMP | 42 4D
|
| GIF | 47 49 46 38 39 61
或 47 49 46 38 37 61
|
| JPEG | FF D8
|
| PNG | 89 50 4E 47 0D 0A 1A 0A
|
| WebP | 52 49 46 46 ?? ?? ?? ?? 57 45 42 50
|
| SVG | 3C 3F 78 6D 6C
|
在 C# 中,可以使用 System.IO.BinaryReader
类读取文件头标识符。以下是一个示例:
using System.IO;
string base64 = "data:image/png;base64,iVBORw0KG...";
byte[] bytes = Convert.FromBase64String(base64.Split(',')[1]);
string mimeType = null;
using (MemoryStream ms = new MemoryStream(bytes))
{
using (BinaryReader br = new BinaryReader(ms))
{
byte[] fileIdentifier = br.ReadBytes(8);
if (fileIdentifier.Length >= 4)
{
if (fileIdentifier[0] == 0x42 && fileIdentifier[1] == 0x4D)
{
mimeType = "image/bmp";
}
else if (fileIdentifier[0] == 0x47 && fileIdentifier[1] == 0x49 && fileIdentifier[2] == 0x46 && (fileIdentifier[3] == 0x38 || fileIdentifier[3] == 0x37))
{
mimeType = "image/gif";
}
else if (fileIdentifier[0] == 0xFF && fileIdentifier[1] == 0xD8)
{
mimeType = "image/jpeg";
}
else if (fileIdentifier[0] == 0x89 && fileIdentifier[1] == 0x50 && fileIdentifier[2] == 0x4E && fileIdentifier[3] == 0x47 && fileIdentifier[4] == 0x0D && fileIdentifier[5] == 0x0A && fileIdentifier[6] == 0x1A && fileIdentifier[7] == 0x0A)
{
mimeType = "image/png";
}
else if (fileIdentifier[0] == 0x52 && fileIdentifier[1] == 0x49 && fileIdentifier[2] == 0x46 && fileIdentifier[3] == 0x46 && fileIdentifier[8] == 0x57 && fileIdentifier[9] == 0x45 && fileIdentifier[10] == 0x42 && fileIdentifier[11] == 0x50)
{
mimeType = "image/webp";
}
else if (fileIdentifier[0] == 0x3C && fileIdentifier[1] == 0x3F && fileIdentifier[2] == 0x78 && fileIdentifier[3] == 0x6D && fileIdentifier[4] == 0x6C)
{
mimeType = "image/svg+xml";
}
}
}
}
这种方法的优点是它可以识别更多的文件类型,缺点是它可能需要读取整个文件头标识符数组,因此效率较低。
综上,选择哪种方法取决于具体的场景和需求。