我有一个使用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进行了测试,所有可用的主要浏览器都存在此问题。
答案 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)的方式中的一个错误。查明确切的问题太困难了,我们在春季升级后继续前进。