Saltar al contenido

Carga de archivos de varias partes mediante Spring Rest Template + Spring Web MVC

Bienvenido a proyecto online, en este sitio vas a encontrar la respuesta a lo que necesitas.

Solución:

La carga de archivos de varias partes funcionó después de la siguiente modificación del código para cargar usando RestTemplate

LinkedMultiValueMap map = new LinkedMultiValueMap<>();
map.add("file", new ClassPathResource(file));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

HttpEntity> requestEntity = new    HttpEntity>(
                    map, headers);
ResponseEntity result = template.get().exchange(
                    contextPath.get() + path, HttpMethod.POST, requestEntity,
                    String.class);

Y agregando MultipartFilter a web.xml

    
        multipartFilter
        org.springframework.web.multipart.support.MultipartFilter
    
    
        multipartFilter
        /*
    

Para la mayoría de los casos de uso, no es correcto registrar MultipartFilter en web.xml porque Spring MVC ya hace el trabajo de procesar su solicitud de varias partes. Incluso está escrito en el javadoc del filtro.

En el lado del servidor, defina un bean multipartResolver en el contexto de su aplicación:

@Bean
public CommonsMultipartResolver multipartResolver()
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
    commonsMultipartResolver.setDefaultEncoding("utf-8");
    commonsMultipartResolver.setMaxUploadSize(50000000);
    return commonsMultipartResolver;

En el lado del cliente, aquí se explica cómo preparar la solicitud para su uso con Spring RestTemplate API:

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);

    LinkedMultiValueMap pdfHeaderMap = new LinkedMultiValueMap<>();
    pdfHeaderMap.add("Content-disposition", "form-data; name=filex; filename=" + file.getOriginalFilename());
    pdfHeaderMap.add("Content-type", "application/pdf");
    HttpEntity doc = new HttpEntity(file.getBytes(), pdfHeaderMap);

    LinkedMultiValueMap multipartReqMap = new LinkedMultiValueMap<>();
    multipartReqMap.add("filex", doc);

    HttpEntity> reqEntity = new HttpEntity<>(multipartReqMap, headers);
    ResponseEntity resE = restTemplate.exchange(uri, HttpMethod.POST, reqEntity, MyResponse.class);

Lo importante es realmente proporcionar un encabezado de disposición de contenido usando el caso exacto y agregar especificadores de nombre y nombre de archivo, de lo contrario, el resolutor multiparte descartará su parte.

Luego, su método de controlador puede manejar el archivo cargado con el siguiente argumento:

@RequestParam("filex") MultipartFile file

Espero que esto ayude.

Aquí está mi ejemplo de trabajo

@RequestMapping(value = "/api/v1/files/upload", method =RequestMethod.POST)
public ResponseEntity upload(@RequestParam("files") MultipartFile[] files) 
    LinkedMultiValueMap map = new LinkedMultiValueMap<>();
    List tempFileNames = new ArrayList<>();
    String tempFileName;
    FileOutputStream fo;

    try 
        for (MultipartFile file : files) 
            tempFileName = "/tmp/" + file.getOriginalFilename();
            tempFileNames.add(tempFileName);
            fo = new FileOutputStream(tempFileName);
            fo.write(file.getBytes());
            fo.close();
            map.add("files", new FileSystemResource(tempFileName));
        

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity> requestEntity = new HttpEntity<>(map, headers);
        String response = restTemplate.postForObject(uploadFilesUrl, requestEntity, String.class);

     catch (IOException e) 
        e.printStackTrace();
    

    for (String fileName : tempFileNames) 
        File f = new File(fileName);
        f.delete();
    
    return new ResponseEntity(HttpStatus.OK);

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)



Utiliza Nuestro Buscador

Deja una respuesta

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

Respuestas a preguntas comunes sobre programacion y tecnología