Agradecemos tu apoyo para extender nuestros escritos en referencia a las ciencias informáticas.
Solución:
No. Utilizar una Resource
en combinación con una adecuada RestTemplate#exchange
método.
Crear un HttpEntity
con el Resource
como el body
. hay ClassPathResource
para representar los recursos de classpath. los RestTemplate
por defecto, registra un ResourceHttpMessageConverter
.
Internamente, el ResourceHttpMessageConverter
transmite el contenido de la solicitud al extremo opuesto de la conexión con StreamUtils#copy(InputStream, OutputStream)
con un tamaño de búfer actualmente establecido en 4096.
Además de la respuesta de @sotirios-delimanolis, también debe especificar esta configuración en su RestTemplate
para que internamente tu org.springframework.http.HttpOutputMessage
es reconocido como org.springframework.http.StreamingHttpOutputMessage
porque de lo contrario, simplemente copia todo el flujo en su flujo interno, por lo que simplemente lo carga en la memoria. De esta manera, utiliza fragmentos de su transmisión original y los envía.
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
Digo eso porque solo hay una implementación de StreamingHttpOutputMessage
y HttpComponentsClientHttpRequestFactory
es el único lugar donde se crea.
Ejemplo reproducible:
MultiValueMap bodyMap = new LinkedMultiValueMap<>();
UrlResource urlResource = new UrlResource(MY_EXTERNAL_FILE_URL) //uses URL#inputStream
@Override
public String getFilename()
return FILE_NAME;
;
bodyMap.add("file", urlResource); //other service uses -- @RequestParam("file") MultipartFile -- in its controller
RequestEntity> request =
RequestEntity.post(URI.create("http://localhost:6666/api/file"))
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(bodyMap);
//should be a @Bean
RestTemplate restTemplate = new RestTemplate ();
HttpComponentsClientHttpRequestFactory requestFactory = new
HttpComponentsClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
System.out.println(restTemplate.exchange(request, FileMetadata.class));
Aquí puedes ver las comentarios y valoraciones de los lectores
Si te ha resultado de provecho nuestro post, sería de mucha ayuda si lo compartes con otros seniors de este modo contrubuyes a extender nuestra información.