原文:https://dev.to/zeroshotanu/fastapi-for-ai-engineers-part-8-uploading-files-with-fastapi-4f9b(作者 @zeroshotanu)
在前面的文章中,我们学习了如何使用 JWT 认证来保护 API,并阻止未授权访问。
现在,我们来探索另一个在几乎每个 AI 应用中都会用到的功能——文件上传。
如果你构建过类似 ChatGPT、文档问答系统、简历分析器、法律合同审查器或医疗报告分析器等应用,你会发现它们有一个共同点:
用户上传一个文件。
没有文件上传,AI 模型就无事可做。
如果你还没有阅读上一篇文章,请先查看它以延续本系列:用 JWT Tokens 保护路由
为什么需要文件上传?
思考一些流行的 AI 应用:
* ChatGPT 允许你上传 PDF 和图片。
* 简历分析器需要你的简历。
* 法律 AI 助手分析合同。
* 医疗 AI 系统分析化验报告。
* RAG 应用从文档中构建知识库。
其工作流程通常如下所示:
用户 │ ▼ 上传文件 │ ▼ FastAPI │ ▼ 保存 / 读取文件 │ ▼ 使用 AI 处理
FastAPI 使文件上传变得极其简单。
安装所需包
FastAPI 使用 python-multipart 来处理上传的文件。
使用以下命令安装:
pip install python-multipart
你的第一个文件上传 API
FastAPI 提供了两个重要的类:
* File
* UploadFile
让我们导入它们。
from fastapi import FastAPI, File, UploadFile app = FastAPI()
创建上传端点
@app.post("/upload")
def upload_file(file: UploadFile):
return {
"filename": file.filename
}
运行应用程序。
打开 Swagger UI。
点击 POST /upload。
你会注意到 FastAPI 自动提供了一个文件选择器。
上传一个文件。
响应:
{
"filename": "resume.pdf"
}
我们的 API 成功接收了上传的文件。
理解 UploadFile
你可能会想:
为什么我们不直接使用字符串或字节?
FastAPI 提供 UploadFile 类,因为它包含了关于上传文件的有用信息。
一些常用的属性是:
file.filename
返回:
resume.pdf
file.content_type
返回:
application/pdf
await file.read()
读取文件内容。
这些属性在构建 AI 应用时变得极其有用。
读取文件内容
假设我们想知道上传了多少字节。
@app.post("/upload")
async def upload_file(file: UploadFile):
contents = await file.read()
return {
"filename": file.filename,
"size": len(contents)
}
示例响应:
{
"filename": "contract.pdf",
"size": 254321
}
注意我们将函数改为:
async def
这是因为 file.read() 是一个异步操作。
保存上传的文件
在许多应用中,我们不只是读取文件。
我们还会将其保存以供后续处理。
@app.post("/upload")
async def upload_file(file: UploadFile):
contents = await file.read()
with open(file.filename, "wb") as f:
f.write(contents)
return {
"message": "File uploaded successfully."
}
让我们理解这段代码。
contents = await file.read()
将上传的文件读入内存。
with open(file.filename, "wb")
创建一个新文件。
"wb" 模式意味着:
w* → 写入
b* → 二进制模式
二进制模式很重要,因为 PDF、图片、Word 文档以及许多其他文件不是纯文本。
f.write(contents)
将上传的数据写入磁盘。
AI 工作流程示例
假设用户上传了一份法律合同。
contract.pdf
│
▼
FastAPI 上传端点
│
▼
保存 PDF
│
▼
提取文本
│
▼
创建嵌入向量
│
▼
存入向量数据库
│
▼
提出问题
这是许多检索增强生成应用遵循的相同工作流程。
类似地,
简历分析器:
Resume.pdf
│
▼
提取文本
│
▼
技能提取
│
▼
ATS 评分
医疗报告分析器:
Blood_Report.pdf
│
▼
OCR / 文本提取
│
▼
LLM 分析
│
▼
健康摘要
文件上传几乎是每个基于文档的 AI 应用的入口点。
UploadFile 与 bytes 的区别
FastAPI 同样允许以原始字节的形式上传文件。
@app.post("/upload")
async def upload(file: bytes = File()):
return {
"size": len(file)
}
尽管这行得通,但它很少用于处理大型文件。
UploadFile 通常是更好的选择,因为:
* 它提供了文件名和内容类型等元数据。
* 它针对较大的上传进行了优化。
* 它的内存效率更高。
对于大多数生产环境应用,UploadFile 是推荐的选择。
完整示例
from fastapi import FastAPI, UploadFile
app = FastAPI()
@app.post("/upload")
async def upload_file(file: UploadFile):
contents = await file.read()
with open(file.filename, "wb") as f:
f.write(contents)
return {
"filename": file.filename,
"content_type": file.content_type,
"size": len(contents),
"message": "Upload Successful"
}
工作流程回顾
用户上传文件
│
▼
FastAPI 接收上传
│
▼
创建 UploadFile 对象
│
▼
读取文件
│
▼
保存文件
│
▼
AI 开始处理
最终总结
文件上传是现代 AI 后端最重要的功能之一。
无论你是在构建基于 PDF 的聊天助手、简历分析器、法律合同助手,还是医疗报告分析器,每个应用都始于接受用户文件。
今天我们学习了如何:
* 使用 FastAPI 上传文件
* 理解 UploadFile 对象
* 读取上传的文件
* 在本地保存文件
* 理解文件上传在 AI 工作流程中的位置
距离我上次发布已经有一段时间了。我们将在后续的文章中继续我们的 FastAPI 系列。
原文:https://dev.to/zeroshotanu/fastapi-for-ai-engineers-part-8-uploading-files-with-fastapi-4f9b(作者 @zeroshotanu)



