Resumen y Solución a Problemas de Carga de Archivos de Angular a un API en Java

En una aplicación Angular, se ha implementado un formulario que permite la carga de archivos CSV. Sin embargo, el problema radica en que al realizar la llamada HTTP POST al servidor, los objetos InputStream que se esperan en el método del API Java llegan como null. A continuación se presenta un resumen del código utilizado y algunos pasos para solucionar el problema.

Código en Angular

El código de Angular utiliza un formulario para seleccionar y enviar un archivo CSV. Se establece un FormData que incluye los metadatos del archivo y el archivo en sí:

var fileInput = document.getElementById('chosenFile');
var fd = new FormData();
fd.append('fileMetadata', JSON.stringify(imgMetadata));
var file = fileInput.files[0];
fd.append('file', file);

$http.post(uploadurl, fd, {
  transformRequest: angular.identity,
  transformResponse: angular.identity,
  headers: {
    "X-XSRF-TOKEN": PluginHelper.getCsrfToken(),
    "Content-Type": undefined
  }
}).then(function successCallback(response) {
  console.log("In success callback");
  var status = response.status;
  if(status == "200") {
    var isValid = response.data;
    console.log("FIleupload function in java "+isValid);
    if(isValid == "filecopied") {
      $scope.errorText = "filecopied :";
    }
  }
}, function errorCallback(response) {
  console.log("In error callback");
  $scope.errorText = "Error in callback file function";
});

Código en Java

El servidor tiene un método para procesar la carga de archivos que debería leer el InputStream del archivo:

@POST
@Path("/uploadfile/{csvdata}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadfile(@PathParam("csvdata") String csvdata, 
                           @FormDataParam("fileMetadata") String fileMetadata,
                           @FormDataParam("file") InputStream uploadedInputStream,
                           @FormDataParam("file") FormDataContentDisposition fileDetail, 
                           FormDataMultiPart multiPartData) throws Exception {
    // Código para procesar el archivo
}

Problemas Identificados

Durante las pruebas, las salidas indican que uploadedInputStream y formdata llegan como null, aunque se reciben otros parámetros.

Soluciones Propuestas

  1. Revisar los Nombres de los Campos: Asegúrate de que el nombre del campo del archivo en el FormData en Angular coincida exactamente con el que espera el método Java. Por ejemplo, si estás añadiendo el archivo con fd.append('file', file);, entonces en el método Java debería ser @FormDataParam("file").

  2. Verificar el Tipo de Contenido: En los parámetros de la solicitud, asegúrate de que el tipo de contenido de Content-Type esté establecido como undefined o que no se establezca. De lo contrario, Angular adicionará un encabezado que puede interferir con la recepción del archivo.

  3. Comprobar Configuración del Servidor: Asegúrate de que tu servidor está correctamente configurado para manejar solicitudes de tipo multipart/form-data.

  4. Debugging en el Lado del Servidor: Anota o depura el código en el lado del servidor para verificar si está recibiendo correctamente la solicitud y qué parámetros están llegando.

  5. Validar la Recopilación de Metadatos: Asegúrate de que imgMetadata se esté rellenando correctamente antes de formatear y enviar el FormData.

Conclusiones

Siguiendo estas recomendaciones, deberías poder resolver los problemas de carga de archivos y asegurarte de que el archivo se transmite correctamente entre Angular y tu API en Java. Mantente atento a las coincidencias de nombres y al manejo correcto de los tipos de contenido.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *