上传大文件时Spring Boot RestTemplate Timing Out

时间:2018-04-04 16:13:32

标签: spring spring-mvc resttemplate

我正在开发一个接受和过滤json数据流的Web服务。为了测试我的代码,我正在从一个文件中读取json,但是当文件超过2.5MB时,RestTemplate连接会超时。我想知道为什么这不起作用,如果有更好的方法可以做到这一点

    String requestUrl = "http://localhost:" + port + "/v1/filterLarge";

    InputStream is = getClass().getClassLoader().getResourceAsStream("data.json");
    RequestCallback requestCallback = (ClientHttpRequest request) -> {
        request.getHeaders().setContentType(MediaType.APPLICATION_OCTET_STREAM);
        IOUtils.copy(is, request.getBody());
    };

    ResponseExtractor<Void> responseExtractor = (ClientHttpResponse clientHttpResponse) -> {
        InputStream inputStream = clientHttpResponse.getBody();
        try (FileOutputStream os = new FileOutputStream(new File("C:\\Development\\bags.json"))) {
            IOUtils.copy(inputStream, os);
        }
        return null;
    };

    final RestTemplate restTemplate = new RestTemplate();
    SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    requestFactory.setBufferRequestBody(false);
    restTemplate.setRequestFactory(requestFactory);
    restTemplate.execute(requestUrl, HttpMethod.POST, requestCallback, responseExtractor);

这是我的服务器端代码:

@PostMapping(value="/filterLarge")
public ResponseEntity<StreamingResponseBody> filterLarge(HttpServletRequest request) throws IOException  {
    StreamFilter streamFilter = new StreamFilter();
    InputStream is = request.getInputStream();
    return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).cacheControl(CacheControl.noCache()).body(
            (OutputStream outputStream) -> 
                streamFilter.filter(is, outputStream)
            );      
}

1 个答案:

答案 0 :(得分:0)

您已经说过要上传文件,但实际上您只是直接在请求正文中发送文件内容。因此,您需要更改客户端代码以实际执行文件上载(即多部分请求)。您可以在多个SO答案中找到示例实现,例如here。您需要这样做,因为出于安全原因,不建议使用大型POST请求主体。

现在,完成上述操作后,请更改以下属性(reference)以增加默认的可接受限制。

spring.servlet.multipart.max-file-size=<Size>
spring.servlet.multipart.max-request-size=<Size>

或者,如果您仍希望不更改客户端实现,请根据您使用的服务器(boot中的默认值为tomcat)更改以下属性以增加POST限制。 tomcat的默认大小为2 MB。

server.<Server>.max-http-post-size=<Size-In-Bytes>

<Server>可以是“tomcat”或“jetty”或者您使用的任何内容。