[英]StreamingResponseBody returning empty body
我有一个简单的Spring Boot
控制器,它提供 zip 文件,它可以变得相当大。 因此,为了不必将整个文件内容加载到内存中,我正在从要读取的文件中创建一个InputStream
并返回一个StreamingResponseBody
如下所示:
import org.springframework.util.StreamUtils;
@RestController
@RequestMapping("/api/export")
public class ExportController {
@GetMapping(value = "/{fileUuid}")
public StreamingResponseBody exportFile(@PathVariable String fileUuid, HttpServletResponse response) {
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"export.zip\"");
InputStream inputStream = new FileInputStream(this.resolveFile(fileUuid));
return outputStream -> {
StreamUtils.copy(inputStream, outputStream); // also tried inputStream.transferTo(outputStream);
};
}
public File resolveFile(String fileUuid) {
// ...
}
}
现在,这适用于第一个请求 - 但之后大约80% 的请求返回一个空的响应主体(http-response 只包含响应标头)。 我们正在使用JDK11
和Spring Boot 2.4.3
。
我在这里做错了什么?
编辑:
奇怪的是,我能够通过将FileInputStream
包装在InputStreamResource
并返回这个资源而不是StreamingResponseBody
来解决这个问题:
// ...
var resource = new InputStreamResource(new FileInputStream(this.resolveFile(fileUuid)));
return resource;
但我仍然很好奇原来的方法有什么问题..
有一个类似的问题,事实证明,在异步调用填充响应 outputStream 之前,您可能在过滤器中发生了同步流复制。 检查禁用其他 servlet 过滤器是否使其工作。 额外的日志记录也将有助于揭示问题(检查响应数据大小,查看它是否在过滤器链中的某个点增长)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.