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
猜你喜欢
- 一般我们可以使用背景图的方式给图片添加阴影,但对于不固定尺寸的图片如何实现呢?我们可以采取“视觉欺骗 * ”——定义渐变边框来实现运行代码框&
- 本文实例讲述了Python基于pygame实现的font游戏字体。分享给大家供大家参考,具体如下:在pygame游戏开发中,一个友好的UI中
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 2 - Selectors如果你还没有准备好,请先
- 给输入框加个动态背景图<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi
- 看到了很多关于如何读出图片的长度的高度的方法,其实都不实用,大多都是通过图片的大小来判断的,图片的种类众多,通过大小来判断难免要制造很多的代
- 谁在用这些导航google是个大公司,全世界都有google的脚印,韩国的google动画效果非常不错,蓝色理想论坛里已经有人挖过来了,可惜
- 相比较pandas,numpy并没有很直接的rolling方法,但是numpy 有一个技巧可以让NumPy在C代码内部执行这种循环。这是通过
- 最近,我在做网页的时候,经理老是反应网页中一些栏目中没有背景图片。我说:背景图片有的,你刷新看看。但是他说:我可以刷新看看,但是你不能老是让
- 原来的语句是这样的: select sum(sl0000) from xstfxps2 where dhao00 in ( select d
- 目前,Python 科学栈中的所有主要项目都同时支持 Python 3.x 和 Python 2.7,不过,这种情况很快即将结束。去年 11
- 使用非对称加密主要是借助openssl的公钥和私钥,用公钥加密私钥解密,或者私钥加密公钥解密。1.安装openssl和php的openssl
- <style> #L { position:absolute; color:
- 前言:Requests简介Requests 是使用Apache2 Licensed 许可证的 HTTP 库。用 Python 编写,真正的为
- 以前我就是一篇博文 就给出一个好用的函数,它在我几篇博文中被广泛运用的。最近看了不少东西,于是便有了这篇博文,以梳理我学到的新东西。毫无疑问
- 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量,第二个是尽量降低单个对象向客户端同步的数据."九宫格"是最常
- 1. 复制表结构及其数据:create table table_name_new as select * from table_name_o
- It is much easier to criticize somebody else’s work than to create som
- MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由
- 使用 IE8 时发现其原生的 JSON 解析器存在 Bug,让我们先用 IE8 打开 DEMO 页面体验下。http://lab.grace
- 本文实例为大家分享了Python曲线拟合的最小二乘法,供大家参考,具体内容如下模块导入import numpy as npimport ga