Request Files
可以使用 File
定义从客户端上传的文件
注:为了接受上传的文件,需要借助 python-multipart
,这是由于文件是以表单数据的形式上传的
例子
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/files/")
async def create_file(file: bytes = File(...)):
return {"file_size": len(file)}
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
return {"filename": file.filename}
步骤:
- 从
fastapi
导入File
和UploadFile
- 定义文件参数
File
是直接继承于Form
的类- 需要记住的是,从
fastapi
导入的Query
,Path
,File
其实是返回同名类的函数 - 为声明文件正文,必须显示使用
File
,某则会被识别为查询参数或者 body 参数
文件将会以 表单数据 的形式上传,如果在文件参数中声明了 bytes
类型,FastApi 将会以二进制字节的方式读取文件
这意味着整个二进制文件将会存储在内存中,当上传的文件较小时是ok的
但在一些情况中,使用 UploadFile
将会受益
File
parameters with UploadFile
声明文件参数的类型为 UploadFile
UploadFile
相较于 bytes
有以下好处:
- 它使用
spooled file
- 超过内存存储文件的上限时,文件将会存储在硬盘中
- 这意味着对于类似图片,视频,较大的二进制文件,它可以在不消耗全部内存的情况下工作的很好
- 可以从上传的文件中获得元信息
- 他有file-like 的异步接口
- 他暴露了一个 python
SpooledTemporaryFile
对象,可以将其直接传递给其他接受file-like
对象的库
UploadFile
UploadFile
有以下属性
技术细节:
当使用 async
方法时,FastApi 将会在线程池中运行文件方法并且等待他们
UploadFile
直接继承自 Starlette 的 UploadFile
,并且添加了一些必要的组件使其和 Pydantic 以及 FastApi 兼容
What is “Form Data”
HTML 表单(<form></form>
)通常使用不同于 JSON 的 “特殊编码” 发送数据至服务器,
FastAPI 会确保从正确的位置读取数据
技术细节:和之前一节相同
Multiple file uploads
可以同时上传多个文件
它们将与表单数据发送的同一表单字段相关联
使用 List
+ bytes
/UploadFile
from typing import List
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import HTMLResponse
app = FastAPI()
@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]}
@app.get("/")
async def main():
content = """
<body>
<form action="/files/" enctype="multipart/form-data" method="post">
<input name="files" type="file" multiple>
<input type="submit">
</form>
<form action="/uploadfiles/" enctype="multipart/form-data" method="post">
<input name="files" type="file" multiple>
<input type="submit">
</form>
</body>
"""
return HTMLResponse(content=content)
注:
Swagger UI 不支持在同一个表单字段上传多文件
但是,FastAPI 已经和它兼容,通过使用标准 OpenAPI
只要 Swagger UI 支持多文件上传,或者使用其他支持 OpenAPI 的工具,它们将会和 FastAPI 兼容
技术细节:
from fastapi.responses import HTMLResponse
与from starlette.responses import HTMLResponse
相同,前者只是后者的简便形式