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

如何在Flask中从Azure Blob Storage流式传输文件给用户(禁用SAS令牌)

实现Azure存储文件的Flask流式传输(无需服务器本地存储)

完全可以实现流式传输,不用把文件完整下载到服务器再转发,用户端能立刻开始下载,同时也不用依赖SAS令牌。

核心思路

Azure Blob Storage的download_blob()方法返回的是一个可迭代的流式对象,我们可以直接把这个流作为Flask响应的主体,让数据从Azure直接流式传递给用户,全程不需要在服务器本地保存文件。

修改后的完整代码

from flask import Response  # 需要导入Response类

@forecasting_bp.route("/api/download/", methods=["GET"])
def download():
    report = request.args.get("report")
    config_id = request.args.get("config_id")
    extension = request.args.get("extension", ".csv")
    filename = f"{report}{config_id}{extension}"
    blobpath = f"{config_id}/{filename}"
    
    # 获取Blob的流式下载对象,默认分块大小4MB,可通过chunk_size参数调整(比如chunk_size=1024*1024设置为1MB)
    download_stream = blob_client.download_blob(blobpath)
    
    # 根据文件类型设置对应的Content-Type,csv用text/csv,其他类型默认用二进制流
    content_type = "text/csv" if extension == ".csv" else "application/octet-stream"
    
    # 构建流式响应
    response = Response(download_stream, content_type=content_type)
    # 设置下载文件名,让浏览器识别为附件下载
    response.headers["Content-Disposition"] = f"attachment; filename={filename}"
    
    return response

关键改动说明

  • 删掉了本地文件写入的代码块(with open(...)部分),彻底避免服务器存储开销
  • 用Response直接包装Azure的流式对象,Flask会自动分块向用户发送数据
  • 保留了原有的blob_client权限验证逻辑,完全不需要SAS令牌
  • 针对csv文件设置了合适的Content-Type,其他文件默认用二进制流类型,保证浏览器正确处理下载

这样修改后,用户发起请求后会立刻收到下载响应,服务器不会占用额外的磁盘空间,也不会因为大文件导致内存压力过高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:41:04