如何在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
相关产品推荐
相关产品推荐

