
本文旨在指导开发者如何在 FastAPI 框架中实现文件上传并同时接收额外数据的接口。我们将探讨如何利用 UploadFile 类型处理文件上传,并结合其他数据类型构建灵活的 API 端点。通过示例代码和详细说明,您将学会如何高效地构建支持文件上传和数据接收的 FastAPI 应用。
FastAPI 提供了便捷的方式来处理文件上传,结合其他数据类型,可以构建功能强大的 API。以下是如何在 FastAPI 中实现文件上传并同时接收额外数据的详细步骤和示例:
基本实现
FastAPI 使用 UploadFile 类型来处理文件上传。以下是一个基本的示例,展示了如何接收上传的文件以及额外的字符串数据:
from fastapi import FastAPI, UploadFile, File
app = FastAPI()
@app.post("/upload")
async def upload_file(
file: UploadFile = File(...),
transaction_id: str = ...,
organization_id: str = ...
):
"""
上传文件并接收 transaction_id 和 organization_id。
"""
file_name = f"{organization_id}_{transaction_id}_{file.filename}"
contents = await file.read() # 读取文件内容
with open(file_name, "wb") as f:
f.write(contents)
return {"filename": file_name, "size": len(contents)}代码解释:
- @app.post("/upload"): 定义一个处理 POST 请求的路由,路径为 /upload。
- file: UploadFile = File(...): 声明一个名为 file 的参数,类型为 UploadFile,表示上传的文件。File(...) 表示这是一个必选参数。
- transaction_id: str = ...: 声明一个名为 transaction_id 的字符串参数,... 表示这是一个必选参数。
- organization_id: str = ...: 声明一个名为 organization_id 的字符串参数,... 表示这是一个必选参数。
- await file.read(): 异步读取上传文件的内容。
- with open(file_name, "wb") as f:: 以二进制写入模式打开一个文件,文件名为根据 organization_id、transaction_id 和原始文件名生成。
- f.write(contents): 将文件内容写入到新创建的文件中。
- return {"filename": file_name, "size": len(contents)}: 返回一个 JSON 响应,包含文件名和文件大小。
注意事项:
LANUX V1.0 蓝脑商务网站系统 适用于网店、公司宣传自己的品牌和产品。 系统在代码、页面方面设计简约,浏览和后台管理操作效率高。 此版本带可见即可得的html编辑器, 方便直观添加和编辑要发布的内容。 安装: 1.解压后,更换logo、分类名称、幻灯片的图片及名称和链接、联系我们等等页面。 2.将dbconfig.php里面的数据库配置更改为你的mysql数据库配置 3.将整个文件夹上传至
- 文件存储位置: 上述代码将文件保存在服务器的当前工作目录下。在实际应用中,您可能需要将文件存储到更合适的位置,例如云存储服务或数据库。
- 文件名生成: 示例代码简单地将 organization_id、transaction_id 和原始文件名拼接起来作为新文件名。在实际应用中,您需要考虑文件名冲突的问题,并生成唯一的文件名。
- 文件大小限制: 默认情况下,FastAPI 没有限制上传文件的大小。您可以使用 File(...) 中的 max_length 参数来限制文件大小,例如 file: UploadFile = File(..., max_length=1024 * 1024 * 10) 限制文件大小为 10MB。
- 安全性: 处理上传文件时,务必注意安全性。例如,验证文件类型,避免上传恶意文件。
使用 BaseModel 的方法(不推荐):
虽然最初的问题尝试使用 BaseModel 来处理 UploadFile,但这并不是推荐的做法,因为 UploadFile 并非可以直接序列化的数据类型。 直接在函数参数中声明 UploadFile 和其他数据参数是更简洁和推荐的方式。
总结
本文介绍了如何在 FastAPI 中处理文件上传并同时接收额外数据。通过使用 UploadFile 类型和直接在函数参数中声明数据类型,您可以轻松构建灵活高效的 API 端点。请务必注意文件存储位置、文件名生成、文件大小限制和安全性等问题,以确保您的应用程序的稳定性和安全性。








