Class ZipFileResponseBuilder

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

public class ZipFileResponseBuilder extends Object

ZIP 檔案下載 Response 建構器(支援 Range Request)

先產生 ZIP 暫存檔,再提供下載。適用於:

  • 大型 ZIP 檔案需要斷點續傳
  • 需要支援 Range Request 的場景

運作方式

  • 建立暫存 ZIP 檔案
  • 使用 RangeUtils 解析 Range header
  • 回傳完整檔案(200 OK)或部分內容(206 Partial Content)
  • 串流結束時自動刪除暫存檔

使用範例

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

    Product product = productService.findById(id);
    String tenantId = TenantContext.getCurrentTenantId();

    ZipFileResponseBuilder builder = ZipFileResponseBuilder.create("product-images.zip");

    // 新增主圖
    if (product.getMainImage() != null) {
        builder.addFile("main-image.jpg", fileStorage, tenantId,
                product.getMainImage().getFileId());
    }

    // 新增副圖
    int i = 1;
    for (FileDescriptor fd : product.getGalleryImages()) {
        builder.addFile("gallery-" + i++ + ".jpg", fileStorage, tenantId, fd.getFileId());
    }

    return builder.range(rangeHeader).build();
}
See Also:
  • Method Details

    • create

      public static ZipFileResponseBuilder create(String zipFilename)
      建立 ZipFileResponseBuilder
      Parameters:
      zipFilename - ZIP 檔案名稱(如 "images.zip")
      Returns:
      ZipFileResponseBuilder 實例
    • addFile

      public ZipFileResponseBuilder addFile(String entryName, Supplier<InputStream> contentSupplier)
      新增檔案到 ZIP
      Parameters:
      entryName - ZIP 內的檔案名稱
      contentSupplier - InputStream 供應者
      Returns:
      this
    • addFile

      public ZipFileResponseBuilder addFile(String entryName, FileStorage fileStorage, String tenantId, String fileId)
      新增檔案到 ZIP(使用 FileStorage)
      Parameters:
      entryName - ZIP 內的檔案名稱
      fileStorage - FileStorage 實例
      tenantId - 租戶 ID
      fileId - 檔案 ID
      Returns:
      this
    • range

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

      public boolean hasFiles()
      檢查是否有檔案
      Returns:
      是否有檔案
    • getFileCount

      public int getFileCount()
      取得檔案數量
      Returns:
      檔案數量
    • build

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

      建構 ResponseEntity

      產生 ZIP 暫存檔並回傳下載回應。支援 Range Request。

      Returns:
      ResponseEntity with Resource