您可以使用定义要由客户端上传的文件File。
信息
要接收上传的文件,请先安装python-multipart。
例如pip install python-multipart。
这是因为上载的文件作为“表单数据”发送。
1、导入 File
导入File和UploadFile来自fastapi:
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}
2、定义File参数
以与您相同的方式创建文件参数Body或Form:
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}
信息
File是直接从继承的类Form。
但请记住,当你输入Query,Path,File和其他人fastapi,那些实际上是返回特殊类的功能。
声明
要声明文件正文,您需要使用File,因为否则参数将被解释为查询参数或正文(JSON)参数。
这些文件将作为“表单数据”上传。
如果您将路径操作函数参数的类型声明为bytes,则FastAPI将为您读取文件,并且您将以形式接收内容bytes。
请记住,这意味着全部内容将存储在内存中。对于小文件,这将很好地工作。
但是在某些情况下,您可能会受益于使用UploadFile。
3、File 参数与 UploadFile
定义File类型为的参数UploadFile:
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}
使用UploadFile具有以下优点bytes:
它使用“假脱机”文件:
存储在内存中的文件大小上限为最大,超过此限制后,文件将存储在磁盘中。
这意味着它可以很好地用于大型文件,例如图像,视频,大型二进制文件等,而不会占用所有内存。
您可以从上传的文件中获取元数据。
它具有类似文件的 async界面。
它公开了一个实际的PythonSpooledTemporaryFile对象,您可以将其直接传递给需要类似文件的对象的其他库。
3.1、UploadFile
UploadFile 具有以下属性:
filename:str具有上载的原始文件名的A (例如myimage.jpg)。
content_type:str具有内容类型(MIME类型/媒体类型)(例如image/jpeg)的A。
file:一个SpooledTemporaryFile(类似文件的对象)。这是实际的Python文件,您可以将其直接传递给需要“类文件”对象的其他函数或库。
UploadFile具有以下async方法。它们都调用了下面的相应文件方法(使用internal SpooledTemporaryFile)。
write(data):将data(str或bytes)写入文件。
read(size):读取文件的size(int)字节/字符。
seek(offset):转到文件中的字节位置offset(int)。
1、例如,await myfile.seek(0)将转到文件的开头。
2、如果您只运行await myfile.read()一次然后需要再次读取内容,则此功能特别有用。
close():关闭文件。
由于所有这些方法都是async方法,因此您需要“等待”它们。
例如,在async 路径操作函数内部,您可以使用以下命令获取内容:
contents = await myfile.read()
如果您在普通的def 路径操作功能之内,则可以UploadFile.file直接访问,例如:
contents = myfile.file.read()
async 技术细节
使用async方法时,FastAPI在线程池中运行文件方法并等待它们。
Starlette技术细节
FastAPI的UploadFile继承直接从Starlette的UploadFile,但增加了一些必要的部分,使其兼容Pydantic和FastAPI的其他部分。
4、什么是“表格数据”
HTML表单()将数据发送到服务器的方式通常对该数据使用“特殊”编码,这与JSON不同。
FastAPI将确保从正确的位置而不是JSON读取数据。
技术细节枣庄妇科医院哪家好 http://mobile.zzdffkyy.com/
表单中的数据application/x-www-form-urlencoded不包含文件时,通常使用“媒体类型”进行编码。
但是,当表单包含文件时,它将被编码为multipart/form-data。如果使用File,FastAPI将知道它必须从正文的正确部分获取文件。
如果您想了解有关这些编码和表单字段的更多信息,请访问MDN Web文档POST。
警告
您可以在路径操作中声明多个File和Form参数,但也不能声明希望以JSON形式接收的字段,因为请求的主体将使用而不是进行编码。Bodymultipart/form-dataapplication/json
这不是FastAPI的限制,它是HTTP协议的一部分。
5、多个文件上传
可以同时上传多个文件。
它们将与使用“表单数据”发送的同一“表单字段”相关联。
要使用它,请声明Listofbytes或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 = """
"""
return HTMLResponse(content=content)
您将收到所申报的,一个list的bytes或UploadFile。
笔记
请注意,自2019年4月14日起,Swagger UI不支持在同一表单字段中上传多个文件。
不过,使用标准的OpenAPI ,FastAPI已经与它兼容。
因此,只要Swagger UI支持多文件上传或任何其他支持OpenAPI的工具,它们都将与FastAPI兼容。
技术细节
您也可以使用from starlette.responses import HTMLResponse。
FastAPI提供相同starlette.responses的fastapi.responses,就像为你的方便,开发人员。但是大多数可用的响应直接来自Starlette。