簡體   English   中英

StreamingResponseBody 返回空主體

[英]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 只包含響應標頭)。 我們正在使用JDK11Spring 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM