相关文章推荐
不拘小节的马克杯  ·  java生成excel文件以及设置字体,Ex ...·  1 年前    · 
近视的遥控器  ·  异步方法中map、forEach和for循环 ...·  1 年前    · 
任性的枇杷  ·  正则表达式:0-999自然数;求,跪求!_百度知道·  1 年前    · 
阳光的海豚  ·  Git 首选项和设置 - Azure ...·  1 年前    · 
慷慨大方的香烟  ·  c语言sleep出错 - OSCHINA ...·  2 年前    · 
Code  ›  FastAPI(24)- 详解 File,上传文件开发者社区
软件 bytes 上传文件
https://cloud.tencent.com/developer/article/1883204
正直的橡皮擦
1 年前
作者头像
小菠萝测试笔记
0 篇文章

FastAPI(24)- 详解 File,上传文件

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 自动化、性能测试 > FastAPI(24)- 详解 File,上传文件

FastAPI(24)- 详解 File,上传文件

作者头像
小菠萝测试笔记
发布 于 2021-09-27 16:00:02
3.2K 0
发布 于 2021-09-27 16:00:02
举报

前言

可以使用 FastAPI 提供的 File 定义客户端要上传的文件

学习 File 前最好先学习 Form: https://www.cnblogs.com/poloyy/p/15311533.html

安装 python-multipart

要用 File,需要先安装这个库

pip install python-multipart

FIle

File 是继承 Form,所以可以定义和 Form 相同的元数据以及额外的验证

上传单个文件的栗子

#!usr/bin/env python
# -*- coding:utf-8 _*-
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/22 9:52 上午
# file: 21_File.py
import uvicorn
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
# file 参数类型是字节 bytes
@app.post("/files/")
async def create_file(file: bytes = File(...)):
    return {"file_size": len(file)}
# file 参数类型是 UploadFile
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
    result = {
        "filename": file.filename,
        "content-type": file.content_type,
        "read": await file.read()
    return result
if __name__ == "__main__":
    uvicorn.run(app="21_File:app", host="127.0.0.1", port=8080, reload=True, debug=True)

重点

  • 因为 UploadFile 对象提供的方法都是 async 异步的,所以调用的时候都要加 await 比如 (后面会详解 async/await )

await file.read()

  • 当使用异步方法时,FastAPI 在线程池中运行文件方法并等待它们

不加 await 调用 async 方法会报错

    raise ValueError(errors)
ValueError: [TypeError("'coroutine' object is not iterable"), TypeError('vars() argument must have __dict__ attribute')]
WARNING:  StatReload detected file change in '21_File.py'. Reloading...

file: bytes 的请求结果

file: UploadFile 的请求结果

查看 Swagger API 文档

这样就可以直接在 Swagger API 文档上测试上传文件功能啦

file: bytes

  • FastAPI 将会读取文件,接收到的内容就是文件字节
  • 会将整个内容存储在内存中,更适用于小文件

file: UploadFile

FastAPI 的 UploadFile 直接继承了 Starlette 的 UploadFile,但增加了一些必要的部分,使其与 Pydantic 和 FastAPI 的其他部分兼容

UploadFile 相比 bytes 的优势

  • 存储在内存中的文件达到最大大小限制,超过此限制后,它将存储在磁盘中,可以很好地处理大文件,如图像、视频、大型二进制文件等,而不会消耗所有内存
  • 可以从上传的文件中获取元数据
  • 有一个类似文件的 async 异步接口
  • 它公开了一个 Python SpooledTemporaryFile 对象,可以将它传递给其他需要文件的库

UploadFile 具有以下属性

  • filename: str, 上传的原始文件名,例如 myimage.jpg
  • content_type: str,包含 content-type(MIME type / media type),例如 image/jpeg
  • file: 一个 SpooledTemporaryFile(一个类似文件的对象)。 这是实际的 Python 文件,可以将其直接传递给其他需要“类文件”对象的函数或库

UploadFIle 具有以下 async 异步方法

  • write(data): 写入data ( str 或 bytes ) 到文件
  • read(size): 读取文件的 size (int) 个字节/字符
  • seek(offset): 转到文件中的字节位置 offset(int),如: 将转到文件的开头

await myfile.seek(0)

  • close(): 关闭文件

上传多个文件的栗子

from typing import List
@app.post("/files/")
async def create_files(files: List[bytes] = File(...)):
 
推荐文章
不拘小节的马克杯  ·  java生成excel文件以及设置字体,Excel基本数据类型,和合并单元格_ldear的博客-CSDN博客
1 年前
近视的遥控器  ·  异步方法中map、forEach和for循环中带来的异步执行问题_java8中 map循环是异步的吗_sam976的博客-CSDN博客
1 年前
任性的枇杷  ·  正则表达式:0-999自然数;求,跪求!_百度知道
1 年前
阳光的海豚  ·  Git 首选项和设置 - Azure Repos | Microsoft Learn
1 年前
慷慨大方的香烟  ·  c语言sleep出错 - OSCHINA - 中文开源技术交流社区
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号