Как получить 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
метод, чтобы избежать ненужных итераций. Ваше здоровье.