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

如何从Flet-FastAPI服务器向客户端下载文件?

解决Flet-FastAPI服务器文件下载到客户端的问题

问题根源

你当前的代码里,虽然挂载了FletStaticFiles到/files路径,但访问该路径下的文件时会跳转到主页面——这是因为Flet的前端路由会拦截所有请求,优先处理自身页面路由,导致静态文件请求被Flet接管,没正确转发到静态文件服务,即便服务器日志返回200 OK。

可行解决方案

方案1:更换静态文件挂载路径

避开Flet可能拦截的路径,比如把挂载路径改成/static-files,用FastAPI原生的StaticFiles替代FletStaticFiles:

import flet as ft
import flet_fastapi
from fastapi.staticfiles import StaticFiles

async def main(page: ft.Page):
    page.title = "TestApp"
    await page.add_async(ft.Text("this is test app"))

app = flet_fastapi.app(main, upload_dir="files", secret_key="secret_key")
# 挂载到不与Flet路由冲突的路径
app.mount(path="/static-files", app=StaticFiles(directory="files", html=False))

此时访问http://127.0.0.1:8000/static-files/IMG.jpg,就能直接下载服务器./files/IMG.jpg文件。

方案2:调整挂载顺序优先处理静态文件

如果必须用/files路径,把静态文件挂载代码放在Flet app创建之后(FastAPI会优先匹配先挂载的服务):

import flet as ft
import flet_fastapi
from fastapi.staticfiles import StaticFiles

async def main(page: ft.Page):
    page.title = "TestApp"
    await page.add_async(ft.Text("this is test app"))

app = flet_fastapi.app(main, upload_dir="files", secret_key="secret_key")
# 先挂载静态文件服务,确保请求优先被处理
app.mount(path="/files", app=StaticFiles(directory="files", html=False))

这样/files/IMG.jpg的请求会被StaticFiles直接处理,不会被Flet路由拦截。

方案3:在Flet页面内添加下载按钮

如果需要在页面内触发下载,可以添加按钮调用FastAPI的下载接口:

import flet as ft
import flet_fastapi
from fastapi.responses import FileResponse
import os

async def main(page: ft.Page):
    page.title = "TestApp"
    
    async def trigger_download(e):
        await page.launch_url("/download/IMG.jpg")
    
    await page.add_async(ft.ElevatedButton("下载图片", on_click=trigger_download))
    await page.add_async(ft.Text("this is test app"))

app = flet_fastapi.app(main, upload_dir="files", secret_key="secret_key")

# 定义下载接口
@app.get("/download/{filename}")
async def download_file(filename: str):
    file_path = os.path.join("files", filename)
    if os.path.exists(file_path):
        return FileResponse(
            file_path, 
            media_type="application/octet-stream", 
            filename=filename
        )
    return {"error": "文件不存在"}

点击页面按钮即可触发文件下载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:05:19