FastAPI系列(09):文件上传

news/2026/1/25 16:34:05/文章来源:https://www.cnblogs.com/uncleyong/p/19482489

 

本系列汇总,请查看这里: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.mzph.cn/news/1215145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7款AI论文写作工具实测:轻松搞定毕业论文,自动匹配真实参考文献!

大学生、研究者写论文常遇起步难、效率低、合规风险三大痛点,AI论文写作工具可针对性解决。本文拆解痛点后,对比7款主流工具核心功能,重点测评图灵论文AI写作助手:10分钟零基础上手,输入题目选类型即匹配学科框架…

【机器学习深度学习】强化学习与监督学习SFT、RL、RLHF、PPO、DPO - 实践

【机器学习&深度学习】强化学习与监督学习SFT、RL、RLHF、PPO、DPO - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

2026年塑石假山修建优质厂家推荐指南

2026年塑石假山修建优质厂家推荐指南一、文旅景观行业背景与假山配套需求洞察据《2025-2030年中国文旅景观行业发展白皮书》数据显示,2025年国内文旅项目中,景观配套民宿的需求同比增长37.2%,其中塑石假山作为兼具功…

闲置携程任我行礼品卡回收变现,认准京顺回收

在消费场景日益多元的当下,礼品卡作为便捷赠礼方式广泛流行,可大量闲置礼品卡因长期未激活,造成了资源浪费。第三方数据机构调研显示,我国每年闲置礼品卡市场规模超千亿元,旅游类礼品卡占比达23%,“沉睡”的携程…

FastAPI系列(08):form表单数据

本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695 form表单数据 Form组件是fastapi里的 FastAPI可以使用Form组件来接收表单数据,需要先使用pip install python-multipart命令进行安装 安装:…

富强

1.11 #3305. LCS 8 考虑求 LCS 的朴素 dp,\(f_{i,j}\),放到平面上,发现大多数时候都是 \(f_{i,j}\to f_{i+1,j+1}\) 的转移才合法,于是可以发现一行中只有 \((i,i)\) 周围的 \(2K\) 个和他自己的 \(f\) 值是有用的…

多无人机协同侦查、任务分配与智能决策仿真解决方案

一、核心架构设计 多无人机协同系统需整合任务分配、路径规划、协同控制与智能决策四大模块,形成“感知-决策-执行”闭环。整体架构如下: 感知层(传感器/侦察数据)→ 任务分配层(优化算法)→ 路径规划层(避障/协…

民主

1.18 AT_arc184_b [ARC184B] 123 Set 原问题难以直接 dp,经典的,考虑构造一个杨表: \[\begin{matrix} a& 2a& 4a & 8a& {16a}\\ 3a& 6a& 12a & {24a}\\ 9a& {18a} & {36a}\\ …

2025年度盘点:这些板材货架厂家正在引领市场,驶入式货架/重型模具货架/手摇式板材货架,板材货架厂商口碑推荐

随着制造业智能化升级加速,仓储环节的效率与空间利用率成为企业降本增效的关键。板材货架作为重型货物存储的核心设备,其技术迭代与定制化能力直接影响生产流程的流畅性。然而,当前市场存在产品同质化严重、非标需求…

导师严选2026 AI论文工具TOP8:本科生毕业论文全场景测评

导师严选2026 AI论文工具TOP8:本科生毕业论文全场景测评 2026年AI论文工具测评:为何选择这些工具? 随着人工智能技术的不断进步,越来越多的本科生开始借助AI工具辅助论文写作。然而,面对市场上五花八门的论文辅助软件…

面试-Decoder-Only生成模型

1 背景 Decoder-Only 模型(如 GPT 系列、Llama)的工作原理是 “根据上下文预测下一个字” 。这种 “递归”的特性导致了必须将推理过程拆分为两个截然不同的阶段。 输入: 整个历史序列。 输出: 下一个 Token。 循环: 预测出的 Token 会被拼接到输入中,作为下一次计算的…

【毕业设计】基于springboot的人脸识别员工考勤管理系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

亲测好用!继续教育TOP8一键生成论文工具测评

亲测好用!继续教育TOP8一键生成论文工具测评 2026年继续教育论文工具测评:为何需要这份权威榜单? 在当前继续教育领域,论文写作已成为许多学员必须面对的挑战。无论是选题构思、文献检索,还是内容撰写与格式调整&#…

改变人生的方式

我们会列出很多新年计划,告诉自己今年要干什么,到达到设么目标,这没什么,有上进心的人都会这么做。但绝大多数人都会放弃——研究显示,失败率在 80%–90% 之间。原因并不是他们“不够努力”,而是&#xff1…

FastAPI系列(07):请求体数据

本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695 官网 https://fastapi.tiangolo.com/tutorial/body/ 下面用到的是pydantic模块from pydantic import BaseModel, Field, field_validator 请求…

别只盯着那只“鹦鹉”了!Claude3.7与Sora2才是真正的生产力怪兽

在AI圈子里混久了 你会发现一个怪象 大家都只知道那个G开头的模型 其实在很多专业领域 真正的王者早就换人了 比如写代码和长文本分析 Claude系列才是永远的神 它的逻辑推理能力 简直像是一个严谨的大学教授 而不仅仅是一个会聊天的机器人 还有最近火出圈的Sora2 以…

2026链条直销厂家榜:获取优质厂家联系方式,链条/非标链条/不锈钢链条/工业链条,链条源头厂家推荐排行

在全球工业链加速重构的背景下,链条作为机械传动与输送的核心部件,其质量稳定性直接影响设备运行效率与寿命。据中国机械通用零部件工业协会数据显示,2024年我国链条市场规模突破320亿元,年复合增长率达6.8%,但行…

Agent Skill:新一代 AI 设计模式的原理、实践与 MCP 协同应用解析

目录 前言1. Agent Skill 的概念与发展背景1.1 什么是 Agent Skill1.2 Agent Skill 的产生背景 2. Agent Skill 的核心功能与价值2.1 教会模型“如何做”,而不仅是“做什么”2.2 按需加载与条件触发机制2.3 跨平台复用与开放标准 3. Agent Skill 的技术结构设计3.1 …

Git行尾符战争:如何彻底解决CRLF与LF的跨平台噩梦

目录 前言1 问题现象:那些令人困惑的Git警告1.1 典型的警告信息1.2 相关错误现象 2 问题本质:CRLF与LF的历史渊源2.1 技术背景解析2.2 Git的智能处理机制2.3 核心配置参数:core.autocrlf 3 根本原因:为什么会出现这个问题&#xf…

hot100 230.二叉搜索树中第K小的元素

思路:中序遍历。在二叉搜索树中,中序遍历的遍历顺序就是在从小到大遍历节点值,所以遍历到的第k个节点值就是答案。每次递归完左子树,在根节点的操作中,把k减少1,表示按照中序遍历的顺序访问到了一个节点。当…