[英]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.