You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现从Azure Blob Storage向浏览器传输大Zip文件的批量下载?

解决方案建议

方案一:生成SAS URL直接下载(推荐)

这是最轻量化的实现方式,完全规避API中间层的资源消耗:

  • 核心优势:Blob直接从Azure Storage传输到客户端,不占用API的CPU、内存或带宽,性能最优,实现成本低。
  • 实现步骤:
    1. 在.NET Core API中,接收用户提交的批量文件列表。
    2. 针对每个Blob,生成带只读权限和短过期时间(如15分钟)的SAS URL。
    3. API返回SAS URL列表给前端,前端可通过JS触发批量下载(或使用前端库实现打包下载)。
  • 关键注意事项:
    • 严格限制SAS的有效期,避免权限泄露;
    • 如果业务要求必须提供单个压缩包,此方案不适用(客户端打包大文件可能受浏览器内存限制)。

方案二:API流式打包Zip返回(适用于需要单个压缩包的场景)

针对必须输出单个Zip文件的需求,可通过流式处理避免将整个5GB数据加载到内存:

  • 核心逻辑:使用System.IO.Compression库,边读取Blob流边写入Zip归档,直接将流推送给客户端,无需在API内存中存储完整压缩包。
  • 代码示例:
[HttpGet("batch-zip-download")]
public async Task<IActionResult> BatchZipDownload([FromQuery] List<string> blobNames)
{
    var blobServiceClient = new BlobServiceClient(Environment.GetEnvironmentVariable("AzureBlobStorageConnectionString"));
    var containerClient = blobServiceClient.GetBlobContainerClient("target-container");

    // 设置响应头
    Response.Headers.Add("Content-Type", "application/zip");
    Response.Headers.Add("Content-Disposition", $"attachment; filename=batch-download-{DateTime.UtcNow:yyyyMMddHHmmss}.zip");

    // 流式生成Zip并写入响应体
    using var archive = new ZipArchive(Response.Body, ZipArchiveMode.Create, leaveOpen: true);
    foreach (var blobName in blobNames)
    {
        var blobClient = containerClient.GetBlobClient(blobName);
        if (!await blobClient.ExistsAsync()) continue;

        var zipEntry = archive.CreateEntry(Path.GetFileName(blobName));
        using var entryStream = zipEntry.Open();
        using var blobStream = await blobClient.OpenReadAsync();
        await blobStream.CopyToAsync(entryStream);
    }

    return new EmptyResult();
}
  • 注意事项:
    • 确保API容器配置了足够的网络带宽,避免成为传输瓶颈;
    • 相比SAS方案,此方案仍会占用API的网络资源,高并发场景下需做好资源监控。

关于Range请求的说明

你提到的Range分块下载方案仅适用于单个大文件的断点续传场景,批量下载或打包下载场景下确实不适用,无需采用该方案。


内容的提问来源于stack exchange,提问作者Nirav Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:44:56