Class FileResponseBuilder

java.lang.Object
io.leandev.appfuse.file.FileResponseBuilder

public class FileResponseBuilder extends Object

檔案下載 Response 建構器

提供統一的檔案下載回應建構,支援:

  • 完整檔案下載(200 OK)
  • 部分內容下載(206 Partial Content)- 支援 Range Request
  • 影音串流(自動處理 Range Request)
  • 斷點續傳

使用範例

@GetMapping("/products/{id}/image")
public ResponseEntity<Resource> getProductImage(
        @PathVariable String id,
        @RequestHeader(value = "Range", required = false) String rangeHeader) {

    Product product = productService.findById(id);  // 權限檢查
    String tenantId = TenantContext.getCurrentTenantId();

    return FileResponseBuilder.from(fileStorage, tenantId, product.getImageFileId())
            .range(rangeHeader)
            .build();
}

影音串流範例

@GetMapping("/videos/{id}")
public ResponseEntity<Resource> streamVideo(
        @PathVariable String id,
        @RequestHeader(value = "Range", required = false) String rangeHeader) {

    Video video = videoService.findById(id);
    String tenantId = TenantContext.getCurrentTenantId();

    // 影音串流自動支援 Range Request,讓用戶可以拖動進度條
    return FileResponseBuilder.from(fileStorage, tenantId, video.getFileId())
            .range(rangeHeader)
            .build();
}
See Also:
  • Method Details

    • from

      public static FileResponseBuilder from(FileStorage fileStorage, String tenantId, String fileId)
      建立 FileResponseBuilder
      Parameters:
      fileStorage - FileStorage 實例
      tenantId - 租戶 ID
      fileId - 檔案 ID
      Returns:
      FileResponseBuilder 實例
    • range

      public FileResponseBuilder range(String rangeHeader)
      設定 Range header(支援部分內容下載)
      Parameters:
      rangeHeader - HTTP Range header 值(如 "bytes=0-1000"),可為 null
      Returns:
      this
    • filename

      public FileResponseBuilder filename(String filename)

      設定下載時的檔名

      若不設定,會使用檔案的原始檔名。

      Parameters:
      filename - 下載時顯示的檔名
      Returns:
      this
    • forceDownload

      public FileResponseBuilder forceDownload()

      強制下載(而非在瀏覽器中開啟)

      設定 Content-Disposition: attachment,讓瀏覽器下載檔案而非直接開啟。

      Returns:
      this
    • build

      public org.springframework.http.ResponseEntity<org.springframework.core.io.Resource> build()

      建構 ResponseEntity

      根據 Range header 決定回應類型:

      • 無 Range header → 200 OK(完整檔案)
      • 有效的 Range header → 206 Partial Content(部分內容)
      • 檔案不存在 → 404 Not Found
      Returns:
      ResponseEntity