¿Cómo obtener MIME-TYPE de Base 64 String?

4 minutos de lectura

Avatar de usuario de Hikmet Tüysüz
Hikmet Tüysüz

Obtengo base64 para la cadena desde el backend y luego lo decodifico en Javascript para mostrarlo en el navegador.

Esta cadena puede ser cualquier archivo .pdf, .img, .docx, .zip, etc.

Mi cadena base64 no incluye el tipo mime, por ejemplo, la parte ‘data:application/pdf;base64’. Entonces necesito obtener el tipo mime de base64.

¿Hay alguna forma de resolver esta solución con Javascript o Jquery?

  • Una cadena codificada en base64 puede contener cualquier cosa, y necesitaría saber su tipo MIME con anticipación para decodificarla correctamente. Como tal, a menos que revise e intente decodificar la cadena en todos los tipos de archivos válidos conocidos (que no es realmente una solución viable), no hay forma de hacer lo que necesita. Yendo hacia adelante necesitar para mantener el prefijo de tipo MIME en la cadena codificada.

    –Rory McCrossan

    17 sep 2019 a las 14:54

  • Busqué en todas partes al respecto, pero algunas personas pueden obtener información de esa cadena. ‘función adivinaImagenMime(datos){ if(datos.charAt(0)==’/’){ return “image/jpeg”; }else if(data.charAt(0)==’R’){ return “image/gif”; }else if(data.charAt(0)==’i’){ return “image/png”; } }’ Gracias por tu respuesta.

    – Hikmet Tüysüz

    17 sep 2019 a las 14:56


  • Sería útil si publicara un enlace de donde obtuvo ese código y la lógica en guessImageMime(). Sin embargo, la pista probablemente esté en el nombre, ‘suposición’, por lo que probablemente esté verificando todos los tipos de archivos esperados como mencioné antes.

    –Rory McCrossan

    17 de septiembre de 2019 a las 14:58

  • ¿Conocías este sitio? base64.guru/convertidor/decodificación/archivo Está decodificando la cadena lo que sea que agregue y diciendo el tipo MIME. ¿Cómo puede ser? Si no es posible en javascript, ¿qué pasa con otros idiomas?

    – Hikmet Tüysüz

    17 sep 2019 a las 15:14


Avatar de usuario de Víctor
Víctor

Puedes usar numeros magicos para detectar un tipo MIME (ver aquí el lista de firmas de archivos). Sin embargo, las firmas de archivos no son 100 % confiables y es fácil encontrar falsos positivos. Por supuesto, hay tareas en las que una solución de este tipo es más que suficiente.

Entonces, si tiene una cadena Base64 y desea identificar su tipo MIME utilizando firmas de archivos, no necesita decodificar Base64. Una forma mucho más rápida es almacenar las firmas del archivo como Base64 y simplemente verificar si la entrada comienza con una de ellas. Un ejemplo sencillo:

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

  • ¿Qué para la imagen/jpeg?

    – Biswas Khayargoli

    27 de julio de 2021 a las 7:38

  • @BiswasKhayargoli Solo verifique si el primer carácter es: ‘/’ (barra inclinada)

    – Deepak

    29 de septiembre de 2021 a las 6:15

  • @Deepak Se encontrará con muchos falsos positivos con solo marcar el primer carácter. Por ejemplo, una barra inclinada coincidirá .mp3 y .tar.xz archivos, así como varias marcas de orden de bytes UTF. Para mejorar la precisión, debe verificar al menos /9j/ (ver mi respuesta actualizada) o usar firmas más precisas como /9j/2w, /9j/4A, /9j/7g, /9j/4Q.

    – Víctor

    2 oct 2021 a las 11:10

  • @Victor Sí, estuvo de acuerdo. Podría ser útil si hay un montón de opciones posibles para verificar que no involucren ninguna otra / :PAGS

    – Deepak

    2 oct 2021 a las 16:46


Avatar de usuario de Patrick
Patricio

Hay ciertos tipos de archivos que indican de qué tipo son en la cadena base 64. Para las imágenes, el primer carácter cambia.

“https://stackoverflow.com/” significa jpeg.

‘yo’ significa png.

‘R’ significa gif.

‘U’ significa webp.

‘J’ significa PDF.

Sin embargo, estos no son confiables, ya que otros archivos a veces pueden comenzar con estos caracteres. Probé el decodificador en el sitio web que mencionaste y no funciona para todos los tipos de archivo. Para algunos archivos, solo devuelve un .bin general. En lo que respecta a la detección, podría intentar decodificar la cadena y probar para ver si se ajusta a un determinado tipo de archivo. Podría intentar crear su propia solución que funcione de la misma manera, pero tendría mucho más sentido detectar el tipo de archivo en función de la extensión, ya que tendrá acceso a él.

¿Ha sido útil esta solución?