【问题标题】:How to get MIME-TYPE from Base 64 String?如何从 Base 64 字符串获取 MIME-TYPE?
【发布时间】:2020-01-18 11:23:08
【问题描述】:

我从后端获取字符串的 base64,然后我在 Javascript 中对其进行解码以显示在浏览器上。

此字符串可以是任何文件 .pdf、.img、.docx、.zip 等。

我的 base64 字符串不包括 mime 类型,例如 'data:application/pdf;base64' 部分。所以我需要得到 base64 的 mime 类型。

有没有办法用 Javascript 或 Jquery 解决这个问题?

【问题讨论】:

  • base64 编码的字符串可以包含任何内容,您需要提前知道其 MIME 类型才能正确解码。因此,除非您尝试将字符串解码为所有已知的有效文件类型(这不是一个真正可行的解决方案),否则无法执行您需要的操作。今后您需要在编码字符串上保留 MIME 类型前缀。
  • 我到处搜索它,但有些人可以从该字符串中获取信息。 'functionguessImageMime(data){ if(data.charAt(0)=='/'){ return "image/jpeg"; }else if(data.charAt(0)=='R'){ return "image/gif"; }else if(data.charAt(0)=='i'){ return "image/png"; } }' 谢谢你的回答。
  • 如果您发布一个指向您从哪里获取该代码的链接以及guessImageMime() 中的逻辑将会很有帮助。线索可能就在名称中——“猜测”——所以它可能正在检查我之前提到的所有预期文件类型。
  • 你知道这个网站吗? base64.guru/converter/decode/file 它正在解码您添加的任何字符串并告诉 MIME 类型。怎么会这样?如果在 javascript 中是不可能的,那么其他语言呢?

标签: javascript jquery base64 mime-types content-type


【解决方案1】:

您可以使用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'));

【讨论】:

  • 图片/jpeg 是什么?
  • @BiswasKhayargoli 只需检查第一个字符是否为:'/'(正斜杠)
  • @Deepak 仅检查第一个字符就会遇到很多误报。例如,正斜杠将匹配 .mp3.tar.xz 文件,以及各种 UTF 字节顺序标记。为了提高准确性,您必须至少检查/9j/(请参阅我更新的答案)或使用更准确的签名,例如/9j/2w/9j/4A/9j/7g/9j/4Q
  • @Victor 是的,同意。如果有一堆可能的选项可以检查哪些不涉及任何其他 / 可能会有所帮助:P
【解决方案2】:

某些文件类型在 base 64 字符串中指示它们的类型。对于图像,第一个字符会发生变化。

'/' 表示 jpeg。

'i' 表示 png。

'R' 表示 gif。

'U' 表示 webp。

'J' 表示 PDF。

但是,这些并不可靠,因为其他文件有时可能以这些字符开头。我在您提到的网站上测试了解码器,它不适用于所有文件类型。对于某些文件,它只返回一个通用的 .bin。就检测而言,它可能会尝试解码字符串并测试以查看某个文件类型是否适合。您可以尝试创建自己的解决方案,以相同的方式工作,但根据扩展名检测文件类型会更有意义,因为您可以访问它。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2015-08-09
    • 2013-11-19
    • 2021-10-14
    • 2011-08-25
    • 2011-04-03
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多