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相同,前者只是后者的简便形式