Как получить MIME-TYPE из строки Base 64?

Я получаю base64 для строки из бэкэнда, а затем декодирую ее в Javascript для отображения в браузере.

Эта строка может быть любым файлом.pdf, .img, .docx, .zip и т. Д.

Моя строка base64 не включает mime-тип, например, часть data:application/pdf;base64. Итак, мне нужно получить MIME-тип base64.

Есть ли способ решить это решение с помощью Javascript или JQuery?

4 ответа

Решение

Вы можете использовать магические числа для определения типа MIME (проверьте здесь список сигнатур файлов). Однако подписи файлов не являются 100% надежными, и вы можете легко столкнуться с ложными срабатываниями. Конечно, есть задачи, когда такого решения более чем достаточно.

Поэтому, если у вас есть строка Base64 и вы хотите определить ее тип MIME с помощью сигнатур файлов, вам не нужно декодировать Base64. Гораздо более быстрый способ - сохранить подписи файлов как Base64 и просто проверить, начинается ли ввод с одной из них. Простой пример:

var signatures = {
  JVBERi0: "application/pdf",
  R0lGODdh: "image/gif",
  R0lGODlh: "image/gif",
  iVBORw0KGgo: "image/png"
};

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'));

Существуют определенные типы файлов, которые указывают, к какому типу они относятся, в строке base 64. Для изображений меняется первый символ.

'/' означает JPEG.

"i" означает png.

"R" означает gif.

"U" означает webp.

"J" означает PDF.

Однако они ненадежны, так как другие файлы иногда могут начинаться с этих символов. Я тестировал декодер на упомянутом вами веб-сайте, и он не работает для всех типов файлов. Для некоторых файлов он просто возвращает общий.bin. Что касается обнаружения, он может попытаться декодировать строку и проверить, подходит ли определенный тип файла. Вы можете попробовать создать собственное решение, которое работает таким же образом, но было бы разумнее определять тип файла на основе расширения, поскольку у вас будет к нему доступ.

Только что обновленная + уменьшенная версия ответа выше /questions/52978382/kak-poluchit-mime-type-iz-stroki-base-64/52978397#52978397

      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];
};

на случай, если ваша конфигурация Eslint не позволяет вам использоватьforэто может быть полезно для вас (и, надеюсь, улучшено вами :)

я используюsomeметод, чтобы избежать ненужных итераций. Ваше здоровье.

Другие вопросы по тегам