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

Azure Functions中FastAPI返回FileResponse无法触发下载如何解决

问题根因
  • 临时路径硬编码:代码中声明了tempFilePath = tempfile.gettempdir()但未实际使用,直接写死/tmp/temp_excel.xlsx路径。虽然Linux消费计划临时目录默认是/tmp,但该写法跨环境兼容性差,本地Windows/macOS环境运行时会直接出现路径不存在错误。
  • ASGI中间件兼容问题:Azure Functions Python Worker的AsgiMiddleware对Starlette/FastAPI原生FileResponse(基于sendfile机制懒加载文件)的适配存在缺陷,在Linux消费计划托管环境下会出现响应头被宿主覆盖、文件内容未正确写入响应体的问题,浏览器无法识别到文件下载标识。
  • 响应头不全:原有代码仅设置了Content-Disposition,未显式指定xlsx格式对应的MIME类型,部分浏览器会将响应当作普通网页内容解析,不会触发下载行为。
修复方案

不要直接通过FileResponse传递文件路径,改为手动读取生成的Excel文件为字节流,通过基础Response对象显式指定全量响应头返回,绕开中间件的适配逻辑,同时修正临时路径的拼接方式。
修正后的可运行代码如下:

import os
import tempfile
import pandas
from fastapi import FastAPI, Response
import azure.functions as func

app = FastAPI()

@app.get("/get_csv")
async def get_csv():
    simulation_results = {
        'Fleet Size': [10, 10],
        "Expected Yearly Demand": [10, 10],
        "Actuals": [10, 10],
        "Service Level": [10, 10]
    }
    df = pandas.DataFrame(data=simulation_results)
    # 动态获取临时目录拼接文件路径,兼容本地、云端所有运行环境
    file_path = os.path.join(tempfile.gettempdir(), 'temp_excel.xlsx')
    df.to_excel(file_path, index=False)

    # 读取文件二进制内容
    with open(file_path, 'rb') as f:
        file_bytes = f.read()

    # 显式配置所有下载必要的响应头
    headers = {
        'Content-Disposition': 'attachment; filename="simulation_result.xlsx"',
        'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'Content-Length': str(len(file_bytes))
    }

    # 直接返回字节流响应,避免FileResponse的适配问题
    return Response(content=file_bytes, headers=headers)

def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
    return func.AsgiMiddleware(app).handle(req, context)
补充说明
  • 临时目录下生成的文件无需手动删除,Azure Functions Linux消费计划会在实例回收时自动清理临时目录内容,不会出现磁盘空间泄漏问题。
  • 如果需要返回超过100MB的大文件,不建议直接读取全量文件到内存,可以改用生成器分段返回字节内容,避免触发消费计划的内存配额限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:09:18