4

У меня есть большая загрузка файла, которую обслуживает RestController на одном сервере, который мне нужно передать через RestController на другом сервере. При непосредственном вызове конечного сервера потоки результатов отлично. Однако при использовании RestTemplate для вызова этого сервера и последующей записи ответа на OutputStream ответ буферизуется на переднем сервере до тех пор, пока весь файл не будет готов, а затем потоковым. Есть ли способ записать файл в OutputStream по мере его поступления?Загрузка потокового файла через RestTemplate

На данный момент мой код на переднем сервере похож на этот

@ResponseBody 
public void downloadResults(HttpServletRequest request, HttpServletResponse response, @RequestParam("id") String jobId, OutputStream stream) 
     throws IOException 
{ 
    byte[] data = restTemplate.exchange("http://localhost/getFile", HttpMethod.POST, requestEntity, byte[].class, parameters).getBody(); 
    stream.write(data); 
} 

я настроил мой RestTemplate не буфер, и я проверил, что это работает, проверив тип запроса, который используется , (SimpleStreamingClientHttpRequest). данные все возвращается правильно, его просто только записывается в поток все сразу, а не как это происходит в

+0

Не уверен, что использование 'RestTemplate' является правильным подходом, поскольку он читает ответ на создание объекта - попробуйте другие подходы, такие как' HttpClient' – shachar

+0

Это должен быть 'RestTemplate', поскольку я проксирую запрос через Zuul, так что нужно использовать их «ClientHttpRequestInterceptor» - если я не могу использовать перехватчики с «HttpClient»? – ali2992

+0

Я решил проблему, вместо использования 'RestTemplate' я использовал' HttpUrlConnection', чтобы сделать базовый http-запрос, используя 'EurekaClient' для получения правильного проксированного маршрута. В онлайн-поиске кажется, что @shachar является правильным, и RestTemplate всегда будет иметь эффект буферизации, поскольку он пытается обернуть ответ в 'HttpEntity' и должен ждать, пока все данные будут готовы – ali2992

ответ