FastAPI 面向 AI 工程师教程(八):用 FastAPI 处理文件上传

原文: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 自动提供了一个文件选择器。

上传一个文件。

📌 显示 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
}


📌 显示上传 PDF 及其名称(图,点击查看)

📌 显示 PDF 名称和字节大小(图,点击查看)

注意我们将函数改为:

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."
    }


📌 上传 PDF(图,点击查看)

📌 PDF 上传成功(图,点击查看)

让我们理解这段代码。

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)

发布评论
全部评论(0)