FastAPI系列(09):文件上传
本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695
上传单个小文件(bytes类型)
示例
from fastapi import FastAPI, File
from typing import List
import uvicorn
app = FastAPI()
@app.post("/file")
async def get_file(file: bytes = File()): # file是字节类型,= File():使用FastAPI的File()依赖注入,接收上传文件的字节数据
# 适合小文件上传
print("file", file)
return {
"file": len(file) # 获取字节数
}
if __name__ == '__main__':
uvicorn.run("upload:app", port=8001, reload=True)
接口文档

请求

响应结果


上传多个小文件(bytes类型)
接口文档

请求数据

响应结果


上传单个各种大小文件(UploadFile类型)
file: UploadFile:类型注解表示参数 file 是 UploadFile 对象类型,UploadFile是FastAPI 提供的专门用于文件上传的对象,比 bytes 更功能丰富
UploadFile vs byte

示例
from fastapi import FastAPI, File, UploadFile
from typing import List
import uvicorn
import os
app = FastAPI()
@app.post("/uploadFile")
async def get_file(file: UploadFile): # 比bytes更功能丰富
# 适合各种大小文件上传
print("file", file)
return {
"fileName": file.filename, "fileSize":file.size
}
if __name__ == '__main__':
uvicorn.run("upload:app", port=8001, reload=True)
接口文档

请求数据

响应结果


file UploadFile(filename='test.png', size=3881, headers=Headers({'content-disposition': 'form-data; name="file"; filename="test.png"', 'content-type': 'image/png'}))
INFO: 127.0.0.1:60952 - "POST /uploadFile HTTP/1.1" 200 OK
上传保存到目录
py文件同目录下创建imgs目录
from fastapi import FastAPI, File, UploadFile
from typing import List
import uvicorn
import os
app = FastAPI()
@app.post("/uploadFile")
async def upload_file(file: UploadFile): # 比bytes更功能丰富
# 适合各种大小文件上传
print("file", file)
path = os.path.join("imgs", file.filename)
# 文件保存
with open(path, "wb") as f:
for line in file.file:
print("line", line)
f.write(line)
return {
"fileName": file.filename, "fileSize":file.size
}
if __name__ == '__main__':
uvicorn.run("upload:app", port=8001, reload=True)
响应结果


上传成功


上传多个各种大小文件(UploadFile类型)
from fastapi import FastAPI, File, UploadFile
from typing import List
import uvicorn
import os
app = FastAPI()
@app.post("/uploadFile")
async def upload_file(file: UploadFile): # 比bytes更功能丰富
# 适合各种大小文件上传
print("file", file)
path = os.path.join("imgs", file.filename)
# 文件保存
with open(path, "wb") as f:
for line in file.file:
print("line", line)
f.write(line)
return {
"fileName": file.filename, "fileSize":file.size
}
@app.post("/uploadFiles")
async def upload_files(files: List[UploadFile]):
# 适合各种大小文件上传
print("file", files)
for file in files:
path = os.path.join("imgs", file.filename)
# 文件保存
with open(path, "wb") as f:
for line in file.file:
# print("line", line)
f.write(line)
return {
"filenames": [file.filename for file in files]
}
if __name__ == '__main__':
uvicorn.run("upload:app", port=8001, reload=True)
接口文档

请求数据

响应结果


file [UploadFile(filename='test.png', size=3881, headers=Headers({'content-disposition': 'form-data; name="files"; filename="test.png"', 'content-type': 'image/png'})), UploadFile(filename='test2.png', size=3881, headers=Headers({'content-disposition': 'form-data; name="files"; filename="test2.png"', 'content-type': 'image/png'}))]
INFO: 127.0.0.1:61454 - "POST /uploadFiles HTTP/1.1" 200 OK

优化:文件上传终极版本
from fastapi import FastAPI, UploadFile
import uvicorn
import os
app = FastAPI()
@app.post("/uploadFile")
async def upload_file(file: UploadFile):
# print("file", file)
path = os.path.join("imgs", file.filename)
# 文件保存
with open(path, "wb") as f:
for chunk in iter(lambda: file.file.read(1024), b''):
f.write(chunk)
return {
"fileName": file.filename, "fileSize":file.size
}
if __name__ == '__main__':
uvicorn.run("upload:app", port=8001, reload=True)
说明:
for chunk in iter(lambda: file.file.read(1024), b''):
这行代码使用 iter() 函数创建了一个迭代器,用于流式读取文件内容。
语法结构分析
- lambda: file.file.read(1024):无参数 lambda 函数,每次调用读取 1024 字节
- b'':停止条件,当读取结果为空字节串时停止迭代
- for chunk in iter(...):遍历每个 1024 字节的数据块
工作原理
- 分块读取:每次读取 1024 字节的数据块(chunk)
- 持续迭代:直到文件结束返回空字节串 b''
- 内存优化:避免一次性加载大文件到内存
这样可以:
- 避免一次性读取整个文件
- 有效控制内存使用
- 适合大文件处理场景
__EOF__
本文作者:持之以恒(韧)
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号