📜  如何在 c# 中从 base64 获取文件类型(1)

📅  最后修改于: 2023-12-03 14:52:14.547000             🧑  作者: Mango

如何在 C# 中从 Base64 获取文件类型

在网络应用程序开发中,经常需要使用 Base64 编码方式传输文件。在接收方收到 Base64 编码的文件时,如何获取文件类型呢?以下是一些方法:

方法一:使用 MimeMapping.GetMimeMapping() 方法
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 6147 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";
            }
        }
    }
}

这种方法的优点是它可以识别更多的文件类型,缺点是它可能需要读取整个文件头标识符数组,因此效率较低。

综上,选择哪种方法取决于具体的场景和需求。