如何从 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'));