spring 413请求实体太大-使用Sping Boot 和Rest模板

vsaztqbk  于 2024-01-05  发布在  Spring
关注(0)|答案(3)|浏览(232)

使用Spring Rest Template上传一个100 MB的文件,使用multipart post请求。
客户代码:

  1. HttpHeaders headers = new HttpHeaders();
  2. headers.setContentType(MediaType.MULTIPART_FORM_DATA);
  3. MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
  4. map.add("name", chunk.getFilename());
  5. map.add("filename", chunk.getFilename());
  6. map.add("flowChunkNumber", chunk.getNumber());
  7. map.add("flowChunkSize", chunkSize);
  8. map.add("flowIdentifier", chunk.getIdentifier());
  9. map.add("flowTotalSize", chunk.getTotalSize());
  10. map.add("flowCurrentChunkSize", chunk.getSize());
  11. map.add("file", chunk.getResource() );
  12. HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<MultiValueMap<String, Object>>(map, headers);
  13. ResponseEntity<String> response = executeForResponse(
  14. baseUri().path("/api/v1/uploads/chunks")
  15. .build().toUri(), HttpMethod.POST, entity, String.class);

字符串
但是,服务器(部署在Amazon AWS上的Springs Boot 应用程序)返回:

  1. org.springframework.web.client.HttpClientErrorException: 413 Request Entity Too Large
  2. at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
  3. at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:614)
  4. at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:570)
  5. at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:545)
  6. at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:466)


奇怪的是,我可以使用angular JS代码将相同的文件上传到同一个Sping Boot 应用程序。
虽然在Angular 代码中我使用:用途:forceChunkSize:true
我可以在java中做同样的事情吗?

pzfprimi

pzfprimi1#

也许这会有所帮助:

  1. SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
  2. factory.setBufferRequestBody(false);
  3. RestTemplate template = new RestTemplate(factory);

字符串
当通过POST或PUT发送大量数据时,建议将此属性更改为false

vq8itlhq

vq8itlhq2#

如果不是你的应用程序故障,可能是它。我也遇到过同样的情况:无论我在Sping Boot 应用程序中配置什么,都出现错误413。我试图在本地重现这个问题,但无法做到这一点-在本地我没有得到错误。我发现实际上我从Kubernetes ingress控制器中得到错误413,而不是从我的应用程序中得到。我在docs中找到了相应的设置:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size
当我添加

  1. nginx.ingress.kubernetes.io/proxy-body-size: "0"

字符串
进入ingress manifest错误已经消失

dwbf0jvd

dwbf0jvd3#

将此内容添加到应用程序的配置类中。

  1. @Bean
  2. public MultipartConfigElement multipartConfigElement() {
  3. MultipartConfigFactory factory = new MultipartConfigFactory();
  4. factory.setMaxFileSize("200MB");
  5. factory.setMaxRequestSize("200MB");
  6. return factory.createMultipartConfig();
  7. }

字符串

相关问题