FastAPI基础介绍之 文件操作

  您可以使用定义要由客户端上传的文件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。

上一篇:H5 uni.uploadFile后台接收不到文件的解决方案


下一篇:httpClient发送文件