
可以使用 FastAPI 提供的 File 定义客户端要上传的文件
学习 File 前最好先学习 Form:https://cloud.tencent.com/developer/article/1883202
要用 File,需要先安装这个库
pip install python-multipartFile 是继承 Form,所以可以定义和 Form 相同的元数据以及额外的验证

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/9/22 9:52 上午
# file: 21_File.py
"""
import uvicorn
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
# file 参数类型是字节 bytes
@app.post("/files/")
async def create_file(file: bytes = File(...)):
return {"file_size": len(file)}
# file 参数类型是 UploadFile
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
result = {
"filename": file.filename,
"content-type": file.content_type,
"read": await file.read()
}
return result
if __name__ == "__main__":
uvicorn.run(app="21_File:app", host="127.0.0.1", port=8080, reload=True, debug=True)await file.read()

raise ValueError(errors)
ValueError: [TypeError("'coroutine' object is not iterable"), TypeError('vars() argument must have __dict__ attribute')]
WARNING: StatReload detected file change in '21_File.py'. Reloading...


这样就可以直接在 Swagger API 文档上测试上传文件功能啦
FastAPI 的 UploadFile 直接继承了 Starlette 的 UploadFile,但增加了一些必要的部分,使其与 Pydantic 和 FastAPI 的其他部分兼容
上传的原始文件名,例如 myimage.jpgawait myfile.seek(0)
from typing import List
@app.post("/files/")
async def create_files(files: List[bytes] = File(...)):
return {"file_sizes": [len(file) for file in files]}
@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile] = File(...)):
return {"filenames": [file.filename for file in files]}
