【问题标题】:Stream file download through RestTemplate通过 RestTemplate 流式下载文件
【发布时间】:2016-06-21 08:59:12
【问题描述】:

我有一个大型文件下载,由一台服务器上的 RestController 提供服务,我需要通过另一台服务器上的 RestController 进行流式传输。当直接调用终端服务器时,结果流很好。但是,当使用 RestTemplate 调用此服务器然后将响应写入 OutputStream 时,响应会在前端服务器上缓冲,直到整个文件准备好,然后流式传输。有没有办法可以将文件写入到 OutputStream 中?

目前我在前端服务器上的代码与此类似

@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) 来验证这是否有效。 数据全部返回正确,它只是一次全部写入流,而不是当它进来时

【问题讨论】:

  • 不确定使用 RestTemplate 是正确的方法,因为它读取响应来构造实体 - 尝试其他方法,例如 HttpClient
  • 它必须是 RestTemplate,因为我通过 Zuul 代理请求,所以需要使用他们的 ClientHttpRequestInterceptor - 除非我仍然可以使用带有 HttpClient 的拦截器?
  • 我已经解决了我的问题,而不是使用RestTemplate 我使用HttpUrlConnection 发出基本的http 请求,使用EurekaClient 检索正确的代理路由。在网上看,@shachar 似乎是正确的,并且 RestTemplate 总是会产生缓冲作用,因为它试图将响应包装在 HttpEntity 中并且必须等待所有数据准备好

标签: java spring spring-boot outputstream spring-cloud-netflix


【解决方案1】:

您可以使用 restTemplate.execute。见https://www.baeldung.com/spring-resttemplate-download-large-file

【讨论】:

    【解决方案2】:

    RestTemplate 不适用于流式传输响应正文,如pointed out in this JIRA issue

    【讨论】:

    • 您有如何使用 webclient 的示例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多