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

ASP.NET Core Web应用从Azure Blob Storage下载Blob至浏览器默认下载文件夹

解决方案

后端修正(ASP.NET Core)

你的现有代码仅在服务器端下载了Blob内容,未将内容返回给浏览器,也未触发浏览器的下载行为。需要修改Action返回FileResult,通过响应头引导浏览器自动将文件下载到默认的Downloads文件夹:

public async Task<IActionResult> DownloadBlob(string name, string containerName)
{
    BlobContainerClient container = GetContainer(containerName);
    BlobClient blobClient = container.GetBlobClient(name);

    // 检查Blob是否存在
    if (!await blobClient.ExistsAsync())
    {
        return NotFound();
    }

    // 获取Blob的可读流
    var blobStream = await blobClient.OpenReadAsync();
    
    // 获取Blob的MIME类型,未设置则使用通用二进制类型
    var blobProperties = await blobClient.GetPropertiesAsync();
    var contentType = blobProperties.Value.ContentType ?? "application/octet-stream";

    // 设置响应头,强制浏览器触发下载而非在线打开
    var contentDisposition = new System.Net.Mime.ContentDisposition
    {
        FileName = name,
        Inline = false
    };
    Response.Headers.Add("Content-Disposition", contentDisposition.ToString());

    return File(blobStream, contentType);
}

关键说明:

  • 使用File()方法返回文件流,ASP.NET Core会自动处理响应格式
  • Content-Disposition的Inline=false参数确保浏览器下载文件,而非尝试在线预览
  • 无需指定下载目录,浏览器会自动使用用户预设的默认Downloads文件夹

前端实现无刷新下载

直接用a标签跳转会刷新页面,需通过AJAX获取文件流后,在前端创建临时下载链接:

原生JavaScript示例

async function downloadBlob(name, containerName) {
    try {
        const response = await fetch(`/YourControllerName/DownloadBlob?name=${encodeURIComponent(name)}&containerName=${encodeURIComponent(containerName)}`, {
            method: 'GET'
        });

        if (!response.ok) {
            throw new Error('下载请求失败');
        }

        const blob = await response.blob();
        const url = window.URL.createObjectURL(blob);
        
        // 创建临时a标签触发下载
        const a = document.createElement('a');
        a.href = url;
        a.download = name;
        document.body.appendChild(a);
        a.click();
        
        // 清理临时资源
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);
    } catch (err) {
        console.error(err);
        alert('文件下载失败');
    }
}

页面调用示例

<button onclick="downloadBlob('你的Blob文件名', '你的容器名')">下载文件</button>

Azure Web App部署优化建议

  • 若使用私有Blob容器,需确保Web App具备访问权限(比如配置托管标识)
  • 大文件下载建议使用Blob SAS URL,避免服务器中转消耗带宽:
    public string GetBlobSasUrl(string name, string containerName)
    {
        BlobContainerClient container = GetContainer(containerName);
        BlobClient blobClient = container.GetBlobClient(name);
    
        var sasBuilder = new BlobSasBuilder(BlobSasPermissions.Read, DateTimeOffset.UtcNow.AddMinutes(5))
        {
            BlobContainerName = containerName,
            BlobName = name,
            Resource = "b"
        };
    
        return blobClient.GenerateSasUri(sasBuilder).ToString();
    }
    
    前端拿到SAS URL后,同样用上述创建a标签的方式触发下载,性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:17:43