讲师中心 微信公众号
AI工具推荐 视频效率加速

fastapi 如何优雅实现文件分片上传(支持断点续传)

老杰小哥_5400

老杰小哥_5400

发布时间:2026-01-24 19:33:09

|

260人浏览过

|

来源于php中文网

原创

分片上传关键在于服务端通过唯一upload_id识别同一文件的碎片,而非依赖文件名;客户端需调用/init获取upload_id,后续分片携带upload_id、chunk_index和total_chunks上传,服务端用Redis或数据库持久化分片状态以支持断点续传与安全合并。

fastapi 如何优雅实现文件分片上传(支持断点续传)

分片上传的核心逻辑:客户端如何切片、服务端如何识别同一文件

关键不是“怎么传”,而是“怎么让服务端把一堆碎片认成同一个文件”。客户端必须提供唯一标识(比如 file_id 或基于文件内容生成的 upload_id),再配合每个分片的序号 chunk_index 和总片数 total_chunks。服务端靠 upload_id 聚合所有分片,不能只依赖文件名——重名、并发上传会冲突。

常见错误是直接用 filename 作为 key 存 Redis 或磁盘目录,结果用户同时上传两个同名 PDF,后一个覆盖前一个的分片状态,断点续传直接失效。

实操建议:

  • 客户端在首次上传时调用 /upload/init 接口,服务端生成并返回唯一 upload_id(如 UUID4)
  • 后续每个分片 POST 到 /upload/chunk,携带 upload_id、chunk_index、total_chunks 和二进制数据
  • 服务端用 upload_id 作为 Redis key 存储分片元信息(如已接收哪些 index、文件原始名、总大小),避免状态散落

FastAPI 中处理分片上传的路由与依赖设计

不要把所有逻辑塞进一个 POST handler。用 FastAPI 的依赖注入拆解职责:校验 upload_id 是否合法、检查当前分片是否重复、判断是否为最后一片并触发合并。

例如写一个依赖函数 get_upload_state,它从 Redis 读取 upload_id 对应的状态,若不存在或过期就抛 HTTPException(status_code=404);再写一个 validate_chunk 依赖,确保 chunk_index 在 [0, total_chunks) 范围内且未上传过。

实操建议:

  • 用 BackgroundTasks 做最终的文件合并,避免阻塞请求(尤其大文件)
  • 分片接口返回 200 OK 即可,不要等合并完成;合并失败应单独记录日志并通知(如发 webhook 或写 DB 状态为 failed)
  • 上传状态接口(如 /upload/status?upload_id=xxx)应返回已上传分片数、总片数、合并进度,方便前端刷新 UI

断点续传的关键:如何安全地恢复上传状态

断点续传 ≠ 重传全部,而是客户端先查服务端“我上次传到第几片了?”,然后从下一个 index 继续。这要求服务端持久化每个分片的接收状态,且不能因服务重启丢失。

Skill Weave Chains — 技能链路由引擎
Skill Weave Chains — 技能链路由引擎

开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。

下载

Redis 是常用选择,但要注意:如果用内存型 Redis 且没开启 RDB/AOF,重启后所有分片状态清空,客户端以为能续传,实际得重头来。更稳妥的是用 SQLite 或 PostgreSQL 存分片元数据(upload_id, chunk_index, received_at, size_bytes),哪怕服务挂了也能恢复。

实操建议:

  • 每个分片接收成功后,立刻写入数据库一条记录(带唯一约束:upload_id + chunk_index),避免重复插入
  • 状态查询接口(/upload/resume)返回最大已接收 chunk_index + 1,即下次该传哪一片
  • 客户端上传前先 GET /upload/resume?upload_id=xxx,拿到 next_index 后再发对应分片,而不是盲目从 0 开始

合并分片与清理:别让临时文件堆积失控

合并不是简单把所有分片 cat 拼起来——分片顺序可能乱序到达,且要防止并发合并(两个请求同时检测到“最后一片”而触发两次合并)。必须加分布式锁,或用数据库行锁(UPDATE ... WHERE upload_id = ? AND status = 'pending')保证幂等。

另外,临时分片文件不清理,磁盘迟早爆。不能等合并成功后再删——万一合并失败,碎片残留;也不能一收到就删——还没合并就被删了。合理做法是:合并成功后批量删除分片文件,并标记上传记录为 completed;失败则保留分片供重试,但加 TTL(如 24 小时自动过期)。

实操建议:

  • 用 shutil.copyfileobj 流式合并,避免把所有分片读进内存(尤其 GB 级文件)
  • 合并目标路径用 upload_id 命名,而非原始文件名,防止路径遍历(如原始名含 ../../etc/passwd)
  • 临时分片存放在独立目录(如 /tmp/uploads/chunks/),定期用 cron 清理超时未完成的 upload_id 目录

最易被忽略的一点:前端上传库(如 uppy 或 web-uploader)默认的分片策略和 FastAPI 后端的元信息约定必须完全对齐——比如 chunk_index 是从 0 还是 1 开始、total_chunks 是否包含空片、MD5 校验是传整个文件还是每片单独算。协议不一致,断点续传就会静默失败。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

1913

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

2594

2023.10.07

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

99

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

514

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

476

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

399

2026.06.16

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3048

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4329

2025.10.17

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn