¿Es una mejor práctica usar multipart/form-data en lugar de base64 al recibir archivos en un API?

publicado por: Anonymous

Contexto

He desarrollado un Web Api usando la tecnología .Net y una de las acciones es subir archivos de imágenes.

El API recibirá peticiones de aplicaciones móviles (Android y iOS).

El API debe cumplir con una de estas dos condiciones:

  • Subir un archivo por cada petición usando multipart/form-data, es decir, el archivo viaja embedido directamente en la petición
  • Subir un archivo por cada petición enviándolo en el body como un string codificado en base64

Ambas acciones funcionan y reciben el archivo (se manipula dependiendo del formato en que lo recibe el API).

Pregunta

¿Existe una ventaja o una mejor práctica al usar multipart/form-data en lugar de base64 bajo el escenario expuesto?

solución

base64 es una forma de codificar que te agranda los datos hasta un 30% , multipart/form-data es parte del estándar http y permite enviar datos binarios, debido a eso multipart es mas rápido y consume menos ancho de banda

base64 transforma datos binarios a una representación ASCII “imprimible”, el espacio de 8 bits se reduce a 6 bits y se representa con letras y números (mas un par de símbolos), de ahí que el tamaño total aumente.
Esto se explica muy bien en https://es.wikipedia.org/wiki/Base64#Ejemplo

para esto usa un buffer de 24 bits: mete 3 bytes de 8 bits ( 8 x 3 = 24 ) y salen 4 “letras” de 6 bits cada una ( 6 x 4 = 24 )

como 4 es el 133% de 3 generalmente se dice que aumenta un 30% los datos de entrada.

base64 es mas que nada usado en SMTP (que tiene un espacio de 7bits) es decir servidores y relays de email, o para pasarlo por url (menos el padding = que va a ser transformado a %3D y hay que decodificarlo aparte o calcularlo) un ejemplo común de base64 en url es insertar archivos de imágenes (binario) en HTML, XML o CSS (sólo texto).

En API’s simples puede tener sentido por ejemplo pasar por url un json encodificado en base64 y así la URL contiene toda la info para generar la respuesta (aún así hay ciertos límites prácticos en cuanto al largo total de la URL).

multipart por el contrario permite enviar directamente los datos en binario (bytes de 8 bits) con el Content-Transfer-Encoding: binary

Siendo un API sobre http y tenes que elegir entre ambos, multipart/form-data es la que va.

En caso de subida de archivos grandes con metadata por ejemplo en el API de youtube lo que proveen es un método adicional que separara el proceso en dos partes:
haces un POST con el metadata y recibis (en caso de que este todo ok) un 200 mas la location con el URI a donde hacer el PUT del archivo con el content-length y el content-type, esta URI incluye el id asignado al file asi podes resumir el upload en caso de red inestable, consultar si aun esta en proceso o si ya subió etc..

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *