Python利用fastapi实现上传文件
作者:小飞牛
使用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.
到此这篇关于Python利用fastapi实现上传文件的文章就介绍到这了,更多相关Python fastapi上传文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!