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