本文主要记录表单的数据请求以及上传不同大小的文件、上传多个文件、获取文件信息等相关内容。

表单请求

@app07.post("/stu07/form")
def stu07_form(param1: str = Form(),param2: str = Form(),param3: int = Form()
):return {"param1": param1,"param2": param2,"param3": param3}

同路径参数和查询参数一致,利用fastapi内置的Form方法进行声明即可;

上传一个bytes文件

@app07.post("/stu07/files")
def stu07_files(file: bytes = File()
):return {"files_size": len(file)}

上传文件都是以Form形式进行上传,上面代码中的File也是继承至Form;

如果把路径操作函数参数的类型声明为 bytes,FastAPI 将以 bytes 形式读取和接收文件内容。

这种方式把文件的所有内容都存储在内存里,适用于小型文件。

使用UploadFile上传文件

@app07.post("/stu07/uploadfile/")
def stu07_uploadfile(file: UploadFile
):return {"文件名": file.filename,"内容类型": file.content_type}

UploadFilebytes 相比有更多优势;更适于处理图像、视频、二进制文件等大型文件,好处是不会占用所有内存;

使用UploadFile 也可以直接利用属性获取相关信息:

  • filename:上传文件名字符串(str),例如, myimage.jpg
  • content_type:内容类型(MIME 类型 / 媒体类型)字符串(str),例如,image/jpeg
  • fileSpooledTemporaryFilefile-like 对象)。其实就是 Python文件,可直接传递给其他预期 file-like 对象的函数或支持库。

UploadFile 支持以下 async 方法,(使用内部 SpooledTemporaryFile)可调用相应的文件方法。

  • write(data):把 data (str 或 bytes)写入文件;
  • read(size):按指定数量的字节或字符(size (int))读取文件内容;
  • seek(offset):移动至文件 offset (int)字节处的位置;
    • 例如,await myfile.seek(0) 移动到文件开头;
    • 执行 await myfile.read() 后,需再次读取已读取内容时,这种方法特别好用;
  • close():关闭文件。

注意

上述方法都是 async 方法,要搭配「await」使用;

如在async 路径操作函数内,就需要用以下方式读取内容

contents = await myfile.read()

在普通 def 路径操作函数 内,则可以直接访问 UploadFile.file

contents = myfile.file.read()

可选文件上传

@app07.post("/stu07/optionalfile")
def stu07_optional_file(file: Optional[bytes] = File(None)
):if not file:return {"message": "未上传文件"}else:return {"filesize": len(file)}

同样利用Optional或者Union进行设置即可;

设置元数据

@app07.post("/stu07/uploadfile/metadata/")
def stu07_uploadfile_metadata(file: UploadFile = File(None, description="一个UploadFile文件")
):if not file:return {"message": "未上传文件"}else:return {"filename": file.filename}

这部分内容和路径参数和查询参数一致,根据需求进行设置即可;

上传多文件

@app07.post("/stu07/fileslist")
def stu07_files_list(byteslist: List[bytes] = File(...),uploadfilelist: List[UploadFile] = File(...)
):return {"bytes_files_size": [len(file) for file in byteslist],"upload_filesname": [file.filename for file in uploadfilelist]}

上传多个文件,设置对应参数为List类型即可;

同时上传表单参数和文件

@app07.post("/stu07/form_file/")
def stu07_form_file(file: UploadFile,form: str = Form()
):return {"filename": file.filename,"form": form}

混合上传,即在对应的路径函数中声明不同的参数即可;

源码

# -*- coding: utf-8 -*-
# @Time: 2022/11/30 18:09
# @Author: MinChess
# @File: stu07.py
# @Software: PyCharm
from fastapi import APIRouter, Form, File, UploadFile
from typing import List, Optional
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
from datetime import datetimeapp07 = APIRouter()# 一个form请求
@app07.post("/stu07/form")
def stu07_form(param1: str = Form(),param2: str = Form(),param3: int = Form()
):return {"param1": param1,"param2": param2,"param3": param3}# 上传一个bytes类型的文件
@app07.post("/stu07/files")
def stu07_files(file: bytes = File()
):return {"files_size": len(file)}# 使用UploadFile
@app07.post("/stu07/uploadfile/")
def stu07_uploadfile(file: UploadFile
):return {"文件名": file.filename,"内容类型": file.content_type}# 可选文件上传
@app07.post("/stu07/optionalfile")
def stu07_optional_file(file: Optional[bytes] = File(None)
):if not file:return {"message": "未上传文件"}else:return {"filesize": len(file)}# 设置UploadFile元数据
@app07.post("/stu07/uploadfile/metadata/")
def stu07_uploadfile_metadata(file: UploadFile = File(None, description="一个UploadFile文件")
):if not file:return {"message": "未上传文件"}else:return {"filename": file.filename}# 多文件上传
@app07.post("/stu07/fileslist")
def stu07_files_list(byteslist: List[bytes] = File(...),uploadfilelist: List[UploadFile] = File(...)
):return {"bytes_files_size": [len(file) for file in byteslist],"upload_filesname": [file.filename for file in uploadfilelist]}# 同时上传表单和文件
@app07.post("/stu07/form_file/")
def stu07_form_file(file: UploadFile,form: str = Form()
):return {"filename": file.filename,"form": form}

感谢阅读!

九陌斋地址:https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-biao-dan-qing-qiu-yu-shang-chuan-wen-jian

FastAPI从入门到实战(11)——表单请求与上传文件相关推荐

  1. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  2. 获取当前按钮所在行的input_form表单的input上传文件

    在这次的一个小项目中用到了文件的上传,在之前我对form表单的认知还只是发送用户名和密码.行吧,既然用到了那就硬着头皮上咯. 使用 首先文件的上传需要一个type=file的input.它的意义就是上 ...

  3. [html] Form表单是怎么上传文件的?你了解它的原理吗?

    [html] Form表单是怎么上传文件的?你了解它的原理吗? 简单来说就是把文件转化成字节流,然后使用http进行传输,后端接受后在把二进制转化成原先的文件格式.在HTML表单中,可以上传文件的唯一 ...

  4. Ajax传Form表单,包括上传文件

    2019独角兽企业重金招聘Python工程师标准>>> 被这个问题困扰了好久...真是醉了 借用了jquery 的插件,jquery-form.js,链接:http://jquery ...

  5. 一、PHP基础——表单传值、上传文件

    表单传值 概念: 表单传值即浏览器通过表单元素将用户的选择或者输入的数据提交给后台服务器语言. 为什么使用表单传值? 动态网站(Web2.0)的特点就是后台根据用户的需求定制数据,所谓的"需 ...

  6. html post请求 渲染,FastAPI框架入门 基本使用, 模版渲染, form表单数据交互, 上传文件, 静态文件配置...

    安装 pip install fastapi[all] pip install unicorn 基本使用(不能同时支持,get, post方法等要分开写) from fastapi import Fa ...

  7. avue主、子表单自定义图片上传

    前言 最近新需求要使用vue框架,并且在主.子表单中实现图片上传显示功能. 定义slot插槽 主表单 action 随便写, :file-list 为主表单图片绑定属性,必须为数组,如: [{name ...

  8. javascript --- [FormData的使用] 表单元素转换成表单 对象二进制文件上传

    1. FormData的作用 1.1 将Form表单元素,转换成表单对象 在使用Ajax进行表单提交的时候,采用原生的js获取dom,然后添加属性.当表单项很多的时候,代码会很多.不利于后期阅读.维护 ...

  9. 上传图片的表单java代码_java模拟post方式提交表单实现图片上传(示例代码)

    转自:http://blog.csdn.net/5iasp/article/details/8669644 模拟表单html如下: java代码如下: [java] view plain copy p ...

最新文章

  1. link2005 重复定义错误
  2. python找出文本的位置和替换_python查找文本文档中特定间隔位置的字符并替换
  3. 怎样在CentOS 7.0上安装和配置VNC服务器
  4. 华为matebook和linux版本区别,华为MateBook14Linux版本开箱评测 | 从来没有让我们失望!...
  5. RecyclerView的各种版本兼容问题处理集锦
  6. System center 2012 R2 实战三、windows server 2012R2安装sharepoint2010及排错
  7. ps水彩效果教程-庞姿姿
  8. ros机器人开发概述
  9. 停用所有计算机管理员权限,win10管理员权限被禁用怎么办_win10电脑管理员账户被禁用如何解开-win7之家...
  10. linux安装程序企鹅,在linux下安装fcitx(小企鹅)中文输入法
  11. python爬虫实战:爬取我的博客文章并将文章写入至我的Mysql数据库
  12. package.json scripts 脚本使用指南
  13. linux强制移除pdf密码,linux-使用PDFtk删除pdf文件的最后一页?
  14. 2022年11月(下半年)信息系统项目管理师考试-案例分析真题及解析
  15. pyspark:ML和MLlib
  16. ios11更新提示信任_iOS11怎么设置信任软件
  17. ubuntu python3.5安装_ubuntu12.04安装python3.5及pip3和setuptools
  18. pip 升级到最近21.0.1 后报错 sys.stderr.write(f“ERROR: {exc}“)
  19. MTK5G平台 MT6885/MT6853/MT6873如何配置长按关机
  20. 狠!32岁年薪50万:“谢谢复工把我裁掉!”

热门文章

  1. Python calendar模块的常用有趣用法
  2. bootstrap-suggest 源代码修改 实现二级联动
  3. 将.zip文件转换成字符串进行传送(以支付宝对账单为例
  4. QQ音乐怎么引流?如何利用QQ音乐进行精准引流?
  5. 台服lol手游服务器正在维护,lol手游台服正在取得版本资料怎么办?正在取得版本解决方法[多图]...
  6. 生猛!这篇万字长文,一下子把计算机底层知识说明白了!
  7. 天地劫一直说服务器在维护,《天地劫幽城再临》3.11服务器连接失败解决方法 3月11日登录失败如何解决...
  8. Python 中下划线的 5 种含义
  9. cgroup隔离的知识点
  10. 多个数组合并成一个数组通用方法