使用 Spring Rest 模板上传 100 MB 文件,使用多部分发布请求。
客户代码:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("name", chunk.getFilename());
map.add("filename", chunk.getFilename());
map.add("flowChunkNumber", chunk.getNumber());
map.add("flowChunkSize", chunkSize);
map.add("flowIdentifier", chunk.getIdentifier());
map.add("flowTotalSize", chunk.getTotalSize());
map.add("flowCurrentChunkSize", chunk.getSize());
map.add("file", chunk.getResource() );
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<MultiValueMap<String, Object>>(map, headers);
ResponseEntity<String> response = executeForResponse(
baseUri().path("/api/v1/uploads/chunks")
.build().toUri(), HttpMethod.POST, entity, String.class);
但是服务器(部署在 Amazon AWS 上的 Springs Boot 应用程序)返回:
org.springframework.web.client.HttpClientErrorException: 413 Request Entity Too Large
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:614)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:570)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:545)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:466)
奇怪的是,我可以使用 Angular JS 代码将相同的文件上传到同一个 Spring Boot 应用程序。
尽管在角度代码中我使用:forceChunkSize:true
我可以在java中做同样的事情吗?
也许这有帮助:
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setBufferRequestBody(false);
RestTemplate template = new RestTemplate(factory);
通过 POST 或 PUT 发送大量数据时,建议将此属性更改为 false
如果不是您的应用程序错误,则可能是这样。我遇到了同样的情况:无论我在 Spring boot 应用程序中配置什么,都会出现错误 413。我尝试在本地重现该问题,但无法做到这一点 - 在本地我没有收到错误。我发现实际上我从 Kubernetes 入口控制器而不是我的应用程序收到了错误 413。我在文档中找到了相应的设置:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size
当我添加时
nginx.ingress.kubernetes.io/proxy-body-size: "0"
进入入口清单,错误已消失
将此内容添加到您的应用程序的配置类中。
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("200MB");
factory.setMaxRequestSize("200MB");
return factory.createMultipartConfig();
}