为什么我的API会引发ERR_INCOMPLETE_CHUNKED_ENCODING错误?

时间:2019-12-24 13:01:49

标签: rest spring-boot

我有一个使用Java 8和Spring Boot的REST API构建。该API用于下载文件。我正在使用Spring Boot的StreamingResponseBody类将文件作为数据流发送。

完整的代码段可以在下面找到:

StreamingResponseBody resp = new StreamingResponseBody() { @Override public void writeTo(final OutputStream output) throws IOException { try { Files.copy(myFile.toPath(), output); } finally { output.close(); boolean check = myFile.delete(); log.info("File {} deletion status : {}", myFile.getAbsolutePath(), check); } } };

HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + myFile.getName()); headers.add("Content-Type", "application/octet-stream");

return new ResponseEntity<StreamingResponseBody>(resp, headers, HttpStatus.OK);

该API对某些请求给出了正确的响应,但是在少数情况下,它会引发 ERR_INCOMPLETE_CHUNKED_ENCODING 错误。 我尝试研究了许多地方,但无法解决此问题。 我正在尝试从Angular 8 Web App调用API以下载文件。我使用IE 11,Chrome,Firefox,Edge进行了测试,所有可用的主要浏览器都存在此问题。

2 个答案:

答案 0 :(得分:0)

我认为您的问题是output.close()。

我检查了一些样本,没有人关闭输出。 Spring应在请求后将其关闭。

我也建议您,给您的应用程序施加压力,以检测意外行为。

答案 1 :(得分:0)

添加spring-boot-starter-actuator:2.2.1.RELEASE依赖项时遇到了这个问题。

经过大量搜索之后,将整个项目的升级错配置为spring-boot-starter-parent:2.3.5.RELEASE(也已升级为spring-boot-starter-actuator:2.3.5。释放)修复了所有问题。此次升级后,响应仍然会分块,但浏览器会正确解释。

从这些症状来看,我认为这是spring处理分块响应(特定于http2)的方式中的一个错误。查明确切的问题太困难了,我们在春季升级后继续前进。