
本文介绍了如何在 FastAPI 框架中实现文件上传,并同时接收其他数据。通过结合 UploadFile 类型和请求参数,可以轻松构建支持文件上传和数据传递的 API 接口,解决在处理复杂业务场景时,需要同时上传文件和传递相关元数据的需求。
FastAPI 提供了强大的文件上传功能,结合请求参数,可以方便地实现文件上传和数据传递。以下是如何在 FastAPI 中实现这一功能的详细步骤和示例。
实现方法
FastAPI 使用 UploadFile 类型来处理文件上传。你可以将 UploadFile 作为函数参数,并结合其他参数来接收额外的数据。
示例代码
一款很稀有的jQuery+echarts上传图片生成文字标签云代码,基于echarts图表插件和jQuery实现根据图片样式生成彩色文字标签云特效,点击标签关键词还可以放大。
from fastapi import FastAPI, UploadFile, File
app = FastAPI()
@app.post("/upload")
async def upload_file(
file: UploadFile = File(...), transaction_id: str = None, organization_id: str = None
):
"""
上传文件并接收 transaction_id 和 organization_id。
"""
file_name = f"{organization_id}_{transaction_id}_{file.filename}" # 拼接文件名,包含原始文件名
try:
contents = await file.read() # 使用 await 读取文件内容
with open(file_name, "wb") as f:
f.write(contents)
except Exception as e:
return {"message": f"There was an error uploading the file: {e}"}
finally:
await file.close() # 使用 await 关闭文件
return {"filename": file_name, "message": "File uploaded successfully"}代码解释
- 导入必要的模块: 导入 FastAPI, UploadFile 和 File。File 用于显式声明参数为文件上传。
- 定义路由: 使用 @app.post("/upload") 定义一个 POST 请求的路由。
-
定义函数参数:
- file: UploadFile = File(...): 声明 file 参数为 UploadFile 类型,File(...) 表示这是一个文件上传字段,且为必填项。省略号 ... 表示该参数是必需的。
- transaction_id: str = None: 声明 transaction_id 参数为字符串类型,默认为 None。
- organization_id: str = None: 声明 organization_id 参数为字符串类型,默认为 None。
- 读取文件内容: 使用 await file.read() 异步读取上传文件的内容。 file.file.read() 已经被弃用,推荐使用 await file.read()。
- 保存文件: 使用 open(file_name, "wb") 打开一个文件,并将读取到的文件内容写入。wb 模式表示以二进制写入模式打开文件。
- 关闭文件: 使用 await file.close() 异步关闭文件。 确保文件资源被正确释放。
- 返回结果: 返回一个包含文件名和成功消息的 JSON 响应。
注意事项
- 文件大小限制: FastAPI 默认没有文件大小限制。如果需要限制文件大小,可以使用中间件或者在路由函数中进行检查。
- 文件类型验证: 可以根据 file.content_type 属性来验证文件类型,确保上传的文件符合预期。
- 异常处理: 在处理文件上传时,需要考虑各种异常情况,例如文件读取失败、文件写入失败等。可以使用 try...except 块来捕获并处理这些异常。
- 异步操作: 文件上传通常是 I/O 密集型操作,建议使用异步函数来处理,以避免阻塞主线程。
- 文件名安全: 上面的示例直接使用了用户上传的文件名,存在安全风险。在实际应用中,应该对文件名进行处理,例如生成唯一的文件名,以防止恶意用户上传包含恶意代码的文件。
- 使用 await 关键字: 在读取和关闭文件时,使用了 await 关键字,这是因为 file.read() 和 file.close() 是异步函数,需要使用 await 来等待它们完成。
总结
通过结合 UploadFile 类型和请求参数,可以轻松实现 FastAPI 中的文件上传和数据传递。在实际应用中,需要注意文件大小限制、文件类型验证、异常处理和文件名安全等问题。使用异步函数可以提高应用的性能。








