推荐答案
在 FastAPI 中处理文件上传可以通过 File
和 UploadFile
类来实现。以下是一个简单的示例:
from fastapi import FastAPI, File, UploadFile app = FastAPI() @app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...)): return {"filename": file.filename}
在这个示例中,UploadFile
类用于处理上传的文件,File(...)
用于指定文件是必需的。
本题详细解读
文件上传的基本概念
在 FastAPI 中,文件上传通常通过 HTTP 的 multipart/form-data
请求来实现。UploadFile
类提供了对上传文件的访问和操作。
UploadFile
类的使用
UploadFile
类提供了以下常用方法:
file.read(size: int = -1)
: 读取文件内容。file.write(data: bytes)
: 写入文件内容。file.seek(offset: int)
: 移动文件指针。file.close()
: 关闭文件。
示例代码解析
from fastapi import FastAPI, File, UploadFile app = FastAPI() @app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...)): return {"filename": file.filename}
file: UploadFile = File(...)
:File(...)
表示文件是必需的,如果客户端没有上传文件,FastAPI 会返回 422 错误。file.filename
:获取上传文件的文件名。
处理大文件
对于大文件,可以使用 async with
语句来确保文件在操作完成后被正确关闭:
@app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...)): async with file: contents = await file.read() # 处理文件内容 return {"filename": file.filename}
多文件上传
FastAPI 也支持多文件上传:
@app.post("/uploadfiles/") async def create_upload_files(files: List[UploadFile] = File(...)): return {"filenames": [file.filename for file in files]}
在这个示例中,files
是一个包含多个 UploadFile
对象的列表。
文件上传的限制
可以通过 File
的参数来限制文件的大小和类型:
@app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(..., max_size=1024 * 1024, file_types=["image/jpeg"])): return {"filename": file.filename}
max_size
:限制文件的最大大小。file_types
:限制文件的 MIME 类型。
通过这些方法,FastAPI 提供了灵活且强大的文件上传处理能力。