如何从 Base 64 字符串中获取 MIME-TYPE?
How to get MIME-TYPE from Base 64 String?
我正在从后端获取字符串的 base64,然后在 Javascript 中对其进行解码以在浏览器上显示。
此字符串可以是任何文件 .pdf、.img、.docx、.zip 等。
我的 base64 字符串不包含 MIME 类型,例如 'data:application/pdf;base64' 部分。所以我需要获取 base64 的 mime 类型。
有什么方法可以用 Javascript 或 Jquery 解决这个问题吗?
有些文件类型在 base 64 字符串中指示它们的类型。对于图像,第一个字符会改变。
'/' 表示 jpeg。
'i' 表示 png。
'R'表示gif。
'U'表示webp。
'J'表示PDF。
但是,这些并不可靠,因为其他文件有时会以这些字符开头。我在您提到的网站上测试了解码器,它不适用于所有文件类型。对于某些文件,它只是 returns 一个通用的 .bin。就检测而言,它可能会尝试解码字符串并进行测试以查看某种文件类型是否适合。您可以尝试创建自己的以相同方式工作的解决方案,但根据扩展名检测文件类型更有意义,因为您可以访问它。
您可以使用 magic numbers to detect a MIME type (check here the list of file signatures)。但是,文件签名并非 100% 可靠,您很容易遇到误报。当然,当这样的解决方案绰绰有余时,还有一些任务。
因此,如果您有一个 Base64 字符串并想使用文件签名识别其 MIME 类型,则无需解码 Base64。一种更快的方法是将文件签名存储为 Base64,然后只检查输入是否以其中之一开头。一个简单的例子:
var signatures = {
JVBERi0: "application/pdf",
R0lGODdh: "image/gif",
R0lGODlh: "image/gif",
iVBORw0KGgo: "image/png",
"/9j/": "image/jpg"
};
function detectMimeType(b64) {
for (var s in signatures) {
if (b64.indexOf(s) === 0) {
return signatures[s];
}
}
}
// Some tests
console.log(detectMimeType('R0lGODdhAQABAPAAAP8AAAAAACwAAAAAAQABAAACAkQBADs='));
console.log(detectMimeType('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR42mP4z8AAAAMBAQD3A0FDAAAAAElFTkSuQmCC'));
console.log(detectMimeType('JVBERi0xLjUKJYCBgoMKMSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgMTQxL04gMjAvTGVuZ3'));
console.log(detectMimeType('/9j/4AAQSkZJRgABAQAAZABkAAD/2wCEABQQEBkSGScXFycyJh8mMi4mJiYmLj41NTU1NT5EQUFBQUFBRERERERERERE'));
我正在从后端获取字符串的 base64,然后在 Javascript 中对其进行解码以在浏览器上显示。
此字符串可以是任何文件 .pdf、.img、.docx、.zip 等。
我的 base64 字符串不包含 MIME 类型,例如 'data:application/pdf;base64' 部分。所以我需要获取 base64 的 mime 类型。
有什么方法可以用 Javascript 或 Jquery 解决这个问题吗?
有些文件类型在 base 64 字符串中指示它们的类型。对于图像,第一个字符会改变。
'/' 表示 jpeg。
'i' 表示 png。
'R'表示gif。
'U'表示webp。
'J'表示PDF。
但是,这些并不可靠,因为其他文件有时会以这些字符开头。我在您提到的网站上测试了解码器,它不适用于所有文件类型。对于某些文件,它只是 returns 一个通用的 .bin。就检测而言,它可能会尝试解码字符串并进行测试以查看某种文件类型是否适合。您可以尝试创建自己的以相同方式工作的解决方案,但根据扩展名检测文件类型更有意义,因为您可以访问它。
您可以使用 magic numbers to detect a MIME type (check here the list of file signatures)。但是,文件签名并非 100% 可靠,您很容易遇到误报。当然,当这样的解决方案绰绰有余时,还有一些任务。
因此,如果您有一个 Base64 字符串并想使用文件签名识别其 MIME 类型,则无需解码 Base64。一种更快的方法是将文件签名存储为 Base64,然后只检查输入是否以其中之一开头。一个简单的例子:
var signatures = {
JVBERi0: "application/pdf",
R0lGODdh: "image/gif",
R0lGODlh: "image/gif",
iVBORw0KGgo: "image/png",
"/9j/": "image/jpg"
};
function detectMimeType(b64) {
for (var s in signatures) {
if (b64.indexOf(s) === 0) {
return signatures[s];
}
}
}
// Some tests
console.log(detectMimeType('R0lGODdhAQABAPAAAP8AAAAAACwAAAAAAQABAAACAkQBADs='));
console.log(detectMimeType('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR42mP4z8AAAAMBAQD3A0FDAAAAAElFTkSuQmCC'));
console.log(detectMimeType('JVBERi0xLjUKJYCBgoMKMSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgMTQxL04gMjAvTGVuZ3'));
console.log(detectMimeType('/9j/4AAQSkZJRgABAQAAZABkAAD/2wCEABQQEBkSGScXFycyJh8mMi4mJiYmLj41NTU1NT5EQUFBQUFBRERERERERERE'));