Python利用fastapi实现上传文件
作者:小飞牛 发布时间:2023-12-09 05:54:40
使用File实现文件上传
使用Form表单上传文件,fastapi使用File
获取上传的文件。
指定了参数类型是bytes:file: bytes = File()
,此时会将文件内容全部读取到内存,比较适合小文件。
使用File
需要提前安装 python-multipart
from fastapi import FastAPI, File
app = FastAPI()
@app.post("/files/")
async def create_file(file: bytes = File()):
return {"file_size": len(file)}
只要在路径操作函数中声明了变量的类型是bytes
且使用了File,
则fastapi会将上传文件的内容全部去读到参数中。
使用UploadFile实现文件上传
对于大文件,不适合将文件内容全部读取到内存中,此时使用UploadFile
from fastapi import FastAPI, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile):
return {"filename": file.filename}
和bytes
相比,使用UploadFile
有如下好处:
不需要在使用
File()
作为路径操作函数中参数的默认值不会把文件内容全部加载到内存中,而是批量读取一定量的数据,边读边存硬盘。
可以获取文件的元数据。
该类型的变量可以像文件变量一样操作。
UploadFile的属性
filename:类型是str,用来获取文件的名字,比如:myimage.png
content_type: 类型是str, 用来获取文件的类型,比如:image/png
file: 类文件对象,是一个标准的python文件对象
除了这四个基础属性外,UploadFile还有三个async
方法:
write, 将str或者bytes写到文件中
read: 读文件
seek: 移动光标
close: 关闭文件
# 获取文件内容
contents = await myfile.read()
设置上传文件是可选的
设置默认值是None即可
from typing import Union
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/files/")
async def create_file(file: Union[bytes, None] = File(default=None)):
if not file:
return {"message": "No file sent"}
else:
return {"file_size": len(file)}
@app.post("/uploadfile/")
async def create_upload_file(file: Union[UploadFile, None] = None):
if not file:
return {"message": "No upload file sent"}
else:
return {"filename": file.filename}
上传多个文件
参数的参数的类型是列表:列表元素是bytes或者UploadFile
from typing import List
from fastapi import FastAPI, File, UploadFile
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]):
return {"filenames": [file.filename for file in files]}
知识点补充
1.FastAPI简介
FastAPI是什么
FastAPI是一个现代的,快速(高性能)python web框架。基于标准的python类型提示,使用python3.6+构建API的Web框架。
FastAPI的主要特点如下:
快速:非常高的性能,与NodeJS和Go相当(这个要感谢Starlette和Pydantic),是最快的Python框架之一。
快速编码:将开发速度提高约200%到300%。
更少的bug:减少大约40%的开发人员人为引起的错误。
直观:强大的编辑器支持,调试时间更短。
简单:易于使用和学习。减少阅读文档的时间。
代码简洁:尽量减少代码重复。每个参数可以声明多个功能,减少程序的bug。
健壮:生产代码会自动生成交互式文档。
基于标准:基于并完全兼容API的开放标准:OpenAPI和JSON模式。
FastAPI 站在巨人的肩膀上:
Starlette 用于构建 Web 部件。
Pydantic 用于数据部分。
环境准备
安装fastapi
pip install fastapi
对于生产环境,还需要一个ASGI服务器,如Uvicorn或Hypercorn
pip install "uvicorn[standard]"
入门示例程序
新建一个main.py,编写如下程序:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
运行程序:
uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
来源:https://juejin.cn/post/7111858811933032484


猜你喜欢
- 1.算法:(设查找的数组期间为array[low, high])(1)确定该期间的中间位置K(2)将查找的值T与array[k]比较。若相等
- Swin TransformerSwin Transformer是一种用于图像处理的深度学习模型,它可以用于各种计算机视觉任务,如图像分类、
- python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”我遇到的问题:电脑上已经有
- 智能合约1. 是什么智能合约是一种由计算机程序编写的自动化合约,它可以在没有第三方干预的情况下执行交易和契约条款。智能合约使用区块链技术实现
- 实现效果在网站页面上,点击某个超链接,页面跳转到某个位置,跳转过程有一个动画滚动效果,这是一种比较酷的体验。这种效果是如何实现的呢,本文通过
- 方法一:定义一个函数,参数为所要生成随机字符串的长度。通过random.randint(a, b)方法得到随机数字,具体函数如下:def g
- 用js实现漂亮的雪花飘过效果:步骤:页面基本样式,雪花旋转动画效果body{ width: 100vw; height: 100vh; ba
- 在 HTML 页面中嵌入 JavaScript 脚本需要使用 <script> 标签,用户可以在 <script>
- Embedding词嵌入在 pytorch 中非常简单,只需要调用 torch.nn.Embedding(m, n) 就可以了,m 表示单词
- 本文实例讲述了python集合的创建、添加及删除操作。分享给大家供大家参考,具体如下:集合时无序可变的序列,集合中的元素放在{}内,集合中的
- 在过去的两年里,你能想象的一些很烂的应用设计也入驻了优雅的iPhone。通过它周边的宣传,使得世界各地的设计者们都利用这个新的移动工具来一展
- 一般来说,pytorch 的Parameter是一个tensor,但是跟通常意义上的tensor有些不一样1) 通常意义上的tensor 仅
- python如何跳过异常继续执行下面有两种解决方法第一种是类似if…else…;另外一种是使用语
- 什么是 BokehBokeh 是 Python 中的交互式可视化库。Bokeh提供的最佳功能是针对现代 Web 浏览器进行演示的高度交互式图
- 使用pandas库来读取xlsx格式中的数据。excel中数据:示例代码1:import pandas as pd# data = pd.r
- #!/usr/bin/python#-*-coding:utf-8-*-# JCrawler# Author: Jam <810441
- Dapper的简介Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,
- 1、找到mysql安装路径D:\xxx\MYSQL\MySQL Workbench CE 6.0.8下的mysqldump.exe,由于脚本
- 1. watch 与 computed 的巧妙结合如上图,一个简单的列表页面。你可能会这么做: created(){ this.
- 本文实例为大家分享JavaScript弹出拖拽窗口的具体实现代码,供大家参考,具体内容如下需求说明: 1、点击页面按钮,弹出窗口;