当前位置: 首页 > news >正文

FastAPI系列(09):文件上传

 

本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695

上传单个小文件(bytes类型)

示例

from fastapi import FastAPI, File
from typing import List
import uvicornapp = 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)

  

接口文档

image

 

请求

image

 

响应结果

image

 

image

 

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

接口文档

image

 

 

请求数据

image

 

 

响应结果

image

 

image

 

 

上传单个各种大小文件(UploadFile类型)

file: UploadFile:类型注解表示参数 file 是 UploadFile 对象类型,UploadFile是FastAPI 提供的专门用于文件上传的对象,比 bytes 更功能丰富

UploadFile vs byte

image

 

示例

from fastapi import FastAPI, File, UploadFile
from typing import List
import uvicorn
import osapp = 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)

  

接口文档

image

 

请求数据

image

 

响应结果

image

 

image

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 osapp = 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)

 

响应结果

image

 

image

 

上传成功

image

image

 

上传多个各种大小文件(UploadFile类型)

from fastapi import FastAPI, File, UploadFile
from typing import List
import uvicorn
import osapp = 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)

  

接口文档

image

 

请求数据

image

 

响应结果

image

 

image

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

  

image

 

优化:文件上传终极版本

from fastapi import FastAPI, UploadFile
import uvicorn
import osapp = 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''
  • 内存优化:避免一次性加载大文件到内存

这样可以:

  1. 避免一次性读取整个文件
  2. 有效控制内存使用
  3. 适合大文件处理场景

 

http://www.jsqmd.com/news/298925/

相关文章:

  • 7款AI论文写作工具实测:轻松搞定毕业论文,自动匹配真实参考文献!
  • 【机器学习深度学习】强化学习与监督学习SFT、RL、RLHF、PPO、DPO - 实践
  • 2026年塑石假山修建优质厂家推荐指南
  • 闲置携程任我行礼品卡回收变现,认准京顺回收
  • FastAPI系列(08):form表单数据
  • 富强
  • 多无人机协同侦查、任务分配与智能决策仿真解决方案
  • 民主
  • 2025年度盘点:这些板材货架厂家正在引领市场,驶入式货架/重型模具货架/手摇式板材货架,板材货架厂商口碑推荐
  • 导师严选2026 AI论文工具TOP8:本科生毕业论文全场景测评
  • 面试-Decoder-Only生成模型
  • 【毕业设计】基于springboot的人脸识别员工考勤管理系统(源码+文档+远程调试,全bao定制等)
  • 亲测好用!继续教育TOP8一键生成论文工具测评
  • 改变人生的方式
  • FastAPI系列(07):请求体数据
  • 别只盯着那只“鹦鹉”了!Claude3.7与Sora2才是真正的生产力怪兽
  • 2026链条直销厂家榜:获取优质厂家联系方式,链条/非标链条/不锈钢链条/工业链条,链条源头厂家推荐排行
  • Agent Skill:新一代 AI 设计模式的原理、实践与 MCP 协同应用解析
  • Git行尾符战争:如何彻底解决CRLF与LF的跨平台噩梦
  • hot100 230.二叉搜索树中第K小的元素
  • hot100 199.二叉树的右视图
  • hot100 108.将有序数组转换为二叉搜索树
  • hot100 98.验证二叉搜索树
  • 做久坐提醒+拉伸指导工具,设定工作时长,久坐超一小时自动提醒,推送三分钟简易拉伸动作(图文步骤),记录每日拉伸次数。
  • Java毕设项目:基于springboot的社区健康管理系统(源码+文档,讲解、调试运行,定制等)
  • Java计算机毕设之基于springboot的社区健康管理系统基于SpringBoot的社区医疗健康管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • markdown博客发布多平台实战指南
  • 2025精选浙江干式打磨台靠谱厂家推荐,水帘除尘器/湿式打磨台/喷淋塔除尘器/活性炭吸附干式打磨台制造厂家怎么选择
  • 抖音直播卖货起号-汽水账号自然流提高了
  • 【毕业设计】基于springboot的社区健康管理系统(源码+文档+远程调试,全bao定制等)