FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,由 Python 3.6+ 的类型提示功能驱动。它旨在快速开发,同时不需要牺牲类型安全和性能。本文将详细介绍如何使用 FastAPI 轻松实现文件下载链接的创建。

快速入门:安装 FastAPI

在开始之前,确保你已经安装了 Python。然后,使用以下命令安装 FastAPI:

pip install fastapi uvicorn 

创建一个基本的 FastAPI 应用

首先,创建一个新的 Python 文件,例如 main.py,并导入 FastAPI:

from fastapi import FastAPI app = FastAPI() 

添加文件下载路由

要实现文件下载功能,我们需要创建一个路由,该路由将返回一个文件作为响应。这里我们使用 File 类型来指定响应的内容类型和文件名。

from fastapi import File, HTTPException @app.get("/download/{file_name}") async def download_file(file_name: str): try: file_path = f"./files/{file_name}" if not os.path.exists(file_path): raise HTTPException(status_code=404, detail="File not found") return File(file_path, filename=file_name) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) 

在这个例子中,我们定义了一个名为 /download/{file_name} 的 GET 路由,它接受一个名为 file_name 的参数。该路由尝试从 ./files/ 目录下找到对应的文件,并将其作为下载响应返回。

文件存储和路径

确保你的 files 目录存在,并且包含你想要提供下载的文件。例如,如果你的文件名为 example.txt,那么它应该位于 ./files/example.txt

运行 FastAPI 应用

使用以下命令运行你的 FastAPI 应用:

uvicorn main:app --reload 

这将启动一个本地服务器,默认情况下是 http://127.0.0.1:8000/

测试文件下载

打开浏览器或使用 curl 命令,访问以下链接来测试文件下载:

http://127.0.0.1:8000/download/example.txt 

你应该能够下载名为 example.txt 的文件。

高级技巧:异步文件下载

如果你想要支持大文件或需要异步处理文件下载,你可以使用 StreamingResponse 来实现:

from fastapi import StreamingResponse import os @app.get("/download-stream/{file_name}") async def download_file_stream(file_name: str): try: file_path = f"./files/{file_name}" if not os.path.exists(file_path): raise HTTPException(status_code=404, detail="File not found") def file_generator(): with open(file_path, "rb") as f: while chunk := f.read(1024 * 1024): # Read in chunks of 1MB yield chunk return StreamingResponse(file_generator(), media_type="application/octet-stream", headers={"Content-Disposition": f"attachment; filename={file_name}"}) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) 

在这个例子中,我们使用了 StreamingResponse 来异步地读取和发送文件,这对于处理大文件非常有用。

总结

通过使用 FastAPI,你可以轻松地实现文件下载功能。FastAPI 的简洁性和强大的类型提示功能使得开发变得既快速又安全。希望这篇文章能帮助你更好地理解如何在 FastAPI 中实现文件下载链接。