如何从 base64 字符串获取 MIME 类型?

Posted

技术标签:

【中文标题】如何从 base64 字符串获取 MIME 类型?【英文标题】:How can I get MIME type from base64 String? 【发布时间】:2019-10-27 20:05:41 【问题描述】:

我的 base64 字符串看起来像 "UklGRkAdEQBXQVZFZm10IBIAAAABAAEAg..."。 我尝试通过浏览器下载此文件。所以,

    我通过函数将其转换为 blob:
      b64toBlob: function(b64Data, sliceSize = 512) 
            let byteCharacters = atob(b64Data);
            let byteArrays = [];
            for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) 
                let slice = byteCharacters.slice(offset, offset + sliceSize);
                let byteNumbers = new Array(slice.length);
                for (let i = 0; i < slice.length; i++) 
                    byteNumbers[i] = slice.charCodeAt(i);
                
                let byteArray = new Uint8Array(byteNumbers);
                byteArrays.push(byteArray);
            
            let blob = new Blob(byteArrays);
            return blob;
        
    URL.createObjectURL(this.b64toBlob(base64)) 从 blob 创建 URL 使用创建的 URL 模拟点击 &lt;a&gt; 标记。

Mozilla Firefox 可以识别文件类型并提供下载具有正确扩展名的文件,这很好,但 Chrome 提供下载 txt 文件而不管实际文件类型,这是一个问题。

我可以设置文件类型,当创建 blob 文件时,Chrome 会正常工作,但我不知道如何从 base64 定义正确的 MIME 类型。

【问题讨论】:

您无法检测到字符串化文件的 mimeType。当文件存储为base64时,通常将mimeType保存在数据库中,然后,在向webserver请求文件后,后端将设置适当的Content-Type并输出解码后的base64字符串。使用attachment 标头将提示用户下载文件。 如果你有原来的FILENAME.EXT(extension),你可以将Content-Type设置为application/octet-stream,浏览器会按原样保存文件,但是.EXT 部分将允许本地应用程序打开它,如果用户计算机上有任何适用于您的文件的阅读器。 【参考方案1】:

读取 base64 的第一个字符。

content.charAt(0)

并保留一个具有以下值的开关盒以获取类型

'/' : jpg

'我':png

'R' : gif

'U' : webp

【讨论】:

谢谢,但这还不够。我的文件可能有任何类型。不仅仅是一张图片。

以上是关于如何从 base64 字符串获取 MIME 类型?的主要内容,如果未能解决你的问题,请参考以下文章

Mime / Base 64 编码

从 C# 中的字节 [] 获取内容类型 [关闭]

从 mime 字节验证 base64 编码图像

base64的MIME

像图像或 PDF 文件这样的 MIME 类型不需要 base64 或以其他方式编码吗?

PHP:来自图像字节的图像 mime 类型