javascript 如何从Base 64字符串中获取MIME类型?

y0u0uwnf  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(329)

我从后端获得字符串的base64,然后我在Javascript中解码它,以显示在浏览器上。
此字符串可以是任何文件.pdf,.img,.docx,.zip等。
我的base64字符串不包括MIME类型,例如“data:application/pdf; base64'部分。所以我需要得到base64的mime类型。
有没有办法用Javascript或Jquery来解决这个问题?

5ssjco0h

5ssjco0h1#

您可以使用magic numbers来检测MIME类型(在这里检查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'));
jaxagkaj

jaxagkaj2#

有一些文件类型表明它们在64进制字符串中是什么类型。对于图像,第一个字符会发生变化。
“/”表示jpeg。
“i”表示png。
“R”表示gif。
“U”表示webp。
“J”表示PDF。
然而,这些并不可靠,因为其他文件有时会以这些字符开头。我在你提到的网站上测试了解码器,它并不适用于所有文件类型。对于一些文件,它只返回一个通用的. bin。至于检测,它可能会尝试解码字符串并测试是否适合某个文件类型。你可以尝试创建自己的解决方案,以同样的方式工作。但是基于扩展名检测文件类型会更有意义,因为您可以访问它。

gkl3eglg

gkl3eglg3#

刚刚更新+https://stackoverflow.com/a/58158656/8552163以上答案的缩小版本

const signatures = {
    JVBERi0: 'application/pdf',
    R0lGODdh: 'image/gif',
    R0lGODlh: 'image/gif',
    iVBORw0KGgo: 'image/png',
    '/9j/': 'image/jpg',
};

const getMimeType = (base64)=>{
    for(const sign in signatures)if(base64.startsWith(sign))return signatures[sign];
};

相关问题