How to forward large files with RestTemplate?

前端 未结 3 1184
再見小時候
再見小時候 2020-11-29 01:38

I have a web service call through which zip files can be uploaded. The files are then forwarded to another service for storage, unzipping, etc. For now the file is stored on

3条回答
  •  隐瞒了意图╮
    2020-11-29 02:18

    Edit: The other answers are better (use Resource) https://stackoverflow.com/a/36226006/116509

    My original answer:

    You can use execute for this kind of low-level operation. In this snippet I've used Commons IO's copy method to copy the input stream. You would need to customize the HttpMessageConverterExtractor for the kind of response you're expecting.

    final InputStream fis = new FileInputStream(new File("c:\\autoexec.bat")); // or whatever
    final RequestCallback requestCallback = new RequestCallback() {
         @Override
        public void doWithRequest(final ClientHttpRequest request) throws IOException {
            request.getHeaders().add("Content-type", "application/octet-stream");
            IOUtils.copy(fis, request.getBody());
         }
    };
    final RestTemplate restTemplate = new RestTemplate();
    SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    requestFactory.setBufferRequestBody(false);     
    restTemplate.setRequestFactory(requestFactory);     
    final HttpMessageConverterExtractor responseExtractor =
        new HttpMessageConverterExtractor(String.class, restTemplate.getMessageConverters());
    restTemplate.execute("http://localhost:4000", HttpMethod.POST, requestCallback, responseExtractor);
    

    (Thanks to Baz for pointing out you need to call setBufferRequestBody(false) or it will defeat the point)

提交回复
热议问题