Conversión y Carga de Imágenes desde Base64 a Objeto File en Aplicaciones Web

A continuación se detalla el procedimienot técnico para gestionar la adquisición de imágenes capturadas por dispositivos periféricos, procesar el retorno en formato Base64 y completar su transmisión hacia la infraestructura backend.

Estructura de Datos Retornada

El módulo de adquisición entrega una respuesta JSON estructurada donde el campo clave almacena la codificación de la imagen cruda. La siguiente tabla muestra el esquema esperado de dicha interacción:

{
  accion: "GetImageRet",
  payload: {
    datoImagen: "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5P…………………………2Q==",
    codigoEstado: 0
  },
  identificadorSolicitud: "201905131557726753000"
}

Movimiento de la Interfaz Gráfica

El componente visual debe exponer un campo de lectura para registrar la ubicación final del recurso y un control de acción que active la secuencia de obtención del dispositivo. Se utiliza sintaxis de binding reactiva estándar:

<div class="control-container">
  <label>Ubicación Registro Fotográfico</label>
  <input 
    v-model="modeloDatos.captura" 
    :disabled="modo === 'solo_lectura'" 
    placeholder="Especifique la ruta"... />
  <button @click="ejecutarCaptura()">
    Activar Sensor
  </button>
</div>

Obtención y Manipulación Interna

La lógica principal consiste en realizar la solicitud asíncrona al servicio de captura. En el manejador de respuesta exitosa, se concatenan los encabezados MIME requeridos antes de procesar la decodificación hacia un objeto Blob temporal, evitando el uso de elementos transitorios visibles.

ejecutarCaptura() {
  const pistaLog = generarTimestamp() + Date.now();
  const configPetición = { comando: 'TomarFoto', idTransaccion: pistaLog };

  $.ajax({
    metodo: 'POST',
    destino: urlHardware,
    cuerpo: JSON.stringify(configPetición),
    éxito: (respuestaCompleta) => {
      // Adición de cabecera MIME estandarizada para decodificación
      const cadenaCompleta = 'data:image/jpeg;base64,' + JSON.parse(respuestaCompleta).payload.datoImagen;
      
      // Transformación directa a objeto Binario
      const recursoVirtual = converterStringBase64(recurso, 'image/jpeg');
      
      procesarEnvio(recursoVirtual);
    },
    fallo: () => {
      registrarNotificación('Falla en comunicación con periférico.');
    }
  });
}

Función Auxiliar de Decodificación

Este utilitario es crítico, ya que gestiona la transformación de la cadena de caracteres legibles en unidades de bytes reales. Utiliza la funcionalidad nativa de decodificación, recorre el string resultante para mapear códigos ASCII a un array unificado de bytes y construye un contenedor Binario.

function converterStringBase64(uriOrigen, tipoContenido) {
  const fragmentoCodificado = uriOrigen.split(',')[1];
  const datosDescomprimidos = atob(fragmentoCodificado);
  
  const largoDatos = datosDescomprimidos.length;
  const arrayValores = [];

  for(let i = 0; i < largoDatos; i++) {
    arrayValores.push(datosDescomprimidos.charCodeAt(i));
  }

  return new Blob([new Uint8Array(arrayValores)], {type: tipoContenido});
}

Finalización del Envío de Datos

Con el objeto Blob preparado, el siguiente paso implica su adición al contenedor FormData. Esta técnica permite modificar metadatos como el nombre del archivo basándose en el tiempo actual y asignarlos a parámetros específicos de la solicitud POST.

procesarEnvio(datosBlob) {
  const formateador = new FormData();
  
  formateador.append("categoriaOperacion", "9");
  // Asignación dinámica del nombre del archivo
  const archivoFinal = new File([datosBlob], `registro_${Date.now()}.jpg`);
  
  formateador.append("subidaPrincipal", archivoFinal);
  
  $.ajax({
    metodo: 'POST',
    destino: urlServidor,
    cuerpo: formateador,
    procesoDatos: false,
    contenido: false,
    éxito: (resultBackend) => {
      if(resultBackend.status === 200) {
        asignarValorModelo('captura', resultBackend.info);
      } else {
          manejarAlerta(resultBackend.msg);
      }
    },
    fallo: () => {
        manejarAlerta('Interrupción en la transferencia.');
    }
  });
}

Etiquetas: JavaScript vue.js base64 FormData frontend

Publicado el 8-29 23:15