Request Files


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}

步骤

  1. fastapi 导入 FileUploadFile
  2. 定义文件参数
    • File 是直接继承于 Form 的类
    • 需要记住的是,从 fastapi 导入的 QueryPathFile 其实是返回同名类的函数
    • 为声明文件正文,必须显示使用 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 直接继承自 StarletteUploadFile,并且添加了一些必要的组件使其和 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 HTMLResponsefrom starlette.responses import HTMLResponse 相同,前者只是后者的简便形式

文章作者: qiufeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 qiufeng !
评论
 上一篇
银行家算法 银行家算法
基本概念 安全状态:系统能够按照某种顺序,来为进程分配其所需的资源,如 $<p_1,p_2, \dots , p_n>$,直至每一个进程都可以顺利完成,此时系统为安全状态 安全序列:上述 $<p_1, p_2, \dots
下一篇 
Form Data Form Data
Form Data当需要接受表单字段而不是 JSON 时,可以使用 Form 注:需要借助 python-multipart 来使用表单 使用步骤from fastapi import FastAPI, Form app = FastAP
2020-04-17
  目录