当前位置:

首页 > 编程开发 > TP6.0 构建支持断点续传的超大附件上传服务【分片】

TP6.0 构建支持断点续传的超大附件上传服务【分片】

在ThinkPHP6.0中实现支持断点续传的超大附件上传,采用分片上传方案。前端按2MB切片并生成唯一chunkId,通过GET请求校验已传分片,用localStorage持久化上传状态。后端控制器接收分片存储,创建upload_status表管理进度,合并时加文件锁并校验MD5,确保生产环境下的可靠性与性能。

先说一个核心判断:在 ThinkPHP 6.0 里做超大附件上传,如果只想跑通 Demo,那随便找个插件就能糊弄过去。但真要拿到生产环境去扛 10GB 的视频、5 万个小文件,还要兼容 IE11 和 Chrome、Firefox 的混合访问,那就不是拼凑代码能解决的事了。

这篇内容不聊花架子,直接拆解一套能落地的方案:分片上传、断点续传、多文件并发、刷新页面后进度不丢——每一项都是实战中踩过坑才摸清楚的门道。

TP6.0 构建支持断点续传的超大附件上传服务【分片】

前端分片与上传状态持久化

先说说前端这块。用 File API 读取文件,按 2MB 切片——注意,切片的尺寸必须和后端配置严格一致,不然合并的时候会校验失败,到时候排查起来够你头疼的。

每个分片都需要一个唯一的 chunkId。推荐的做法是用 file.name + file.lastModified + sliceIndex 拼一个 MD5,这个 ID 会贯穿整个上传生命周期。注意,不可重复,不可随机生成,否则断点续传的逻辑会乱掉。

上传前的校验步骤很关键:先发一个 GET 请求到 /api/upload/check?chunkId=xxx&chunkIndex=0,问一下这个分片是不是已经存在。如果服务端返回 200,说明已经存过了,直接跳过;返回 404,再执行 POST 上传。这一步能省掉大量的重复传输,也是断点恢复的基石。

分片上传成功后,立刻调用 localStorage.setItem('upload_' + chunkId, JSON.stringify(...)) 把状态存下来。这里有个常见错误:有人为了省事用 sessionStorage,结果页面一刷新,数据全清空,断点续传直接废掉。必须用 localStorage,这才是真正持久的方案。

TP6 控制器接收与临时存储

后端处理分片,有两种主流方案。

方案一:用 request()->file() 直接接收
在 app/controller/Upload.php 里定义 uploadChunk 方法,接收 chunkid、chunkindex、chunkcount、filename 这些参数。务必校验 chunkindex 是数字且大于等于 0,这一步是为了防止路径穿越攻击,别在这种地方翻车。

方案二:手动读取原始流
如果遇到超大分片,或者 Nginx 配置有局限,request()->file() 可能绕不过去。这时候改用 file_get_contents('php://input') 直接拿原始二进制流,再用 file_put_contents 写入临时目录。这个方案绕过了 TP6 的自带文件校验,所以你得自己做好 MIME 类型白名单过滤,否则就是安全隐患。

所有分片统一存到 runtime/upload/chunks/{date}/{chunkid}/ 目录下,文件名格式为 {chunkid}-{chunkindex}.tmp。日期子目录的作用很实际:防止单目录下文件过多导致 Linux ext4 文件系统性能下降。

服务端断点状态管理

前端的状态管理搞定之后,服务端也得有一套完整的追踪机制。

首先,创建一张 upload_status 表,字段包括 id、chunkid、total_chunks、uploaded_count、status(取值 'uploading'、'completed'、'failed')、updated_time。主键设为 chunkid,避免重复插入。

每次分片上传成功后,执行 INSERT ... ON DUPLICATE KEY UPDATE 语句来更新 uploaded_count,同时记录 updated_time。这个操作是原子性的,不用担心并发导致计数错乱。

用户刷新页面后,前端调用 /api/upload/status?chunkid=xxx,后端从 upload_status 表查当前已上传的分片索引数组,前端据此跳过已传的,从第一个缺失的索引继续上传。

容错处理也很重要:如果某个分片连续 3 次上传失败(HTTP 500 或超时),就把 status 置为 'failed',并记录错误码。前端收到后弹窗提示“第 X 块上传失败,请检查网络”,但不自动重试——避免死循环把磁盘刷爆。

合并逻辑与原子性保障

当最后一个分片(chunkindex == chunkcount - 1)上传完成,就会触发合并流程。这一步最考验严谨性。

具体步骤如下:

① 先用 flock 加写锁。这一步是为了防止多个请求同时合并同一个文件,避免数据错乱。
② 遍历检查所有分片文件是否存在,且大小是否正确——每个分片大约 2MB,最后一片可能略小,这是正常情况。
③ 按 chunkindex 升序,逐个 fopen → fread → fwrite 追加到目标文件。
④ 合并完成后,计算最终文件的 MD5,与前端传来的 fileMd5 比对。如果不一致,立刻 unlink 目标文件并报错。
⑤ 成功后,清理所有 .tmp 分片文件,并将 upload_status.status 更新为 'completed'。

这套逻辑跑下来,基本能覆盖生产环境中的绝大多数异常场景。如果后续遇到性能瓶颈,可以考虑在合并时启用异步任务队列,但那是另一个话题了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 thinkphp
相关文章 更多
codex安装windows教程桌面版完整安装步骤指南
codex安装windows教程桌面版完整安装步骤指南

详解如何在 Windows 电脑上通过 Microsoft Store 安装 Codex 桌面应用,包括启动登录、切换 Codex 模式、关联本地代码项目及终端环境配置的界面操作指引。

github配置ssh key windows
github配置ssh key windows

本文详解如何在Windows环境中使用PowerShell生成SSH密钥对,配置ssh-agent自动加载私钥,并将公钥安全添加至GitHub账户,最后通过git remote set-url切换为SSH地址,解决每次操作需输入账号密码的问题。

backdrop和background区别
backdrop和background区别

深入解析backdrop与background在网页开发及视觉设计中的区别。通过CSS代码示例,展示如何正确使用background设置元素背景,以及利用backdrop-filter创建弹窗遮罩模糊效果,避免概念混用。

windsurf ide download Windows版安装教程
windsurf ide download Windows版安装教程

详解 Windsurf IDE 在 Windows 系统的下载来源、安装步骤及首次启动界面。指导用户如何导入编辑器设置、打开项目文件夹及使用终端与 AI 功能,适合初次接触该工具的开发者阅读。

ServBay安装配置详细教程与操作指南
ServBay安装配置详细教程与操作指南

新手入门 ServBay 本地开发环境,详解安装包下载、Dashboard 状态监控、Packages 组件安装、Services 服务控制及 Websites 项目配置。掌握 .servbay.config 版本管理与日志排查技巧,快速搭建稳定的 PHP、Node.js 等多语言开发环境。

codekit环境配置指南从安装到环境搭建完整教程
codekit环境配置指南从安装到环境搭建完整教程

详解 CodeKit 在 macOS 下的安装步骤、项目导入方法、Sass与JavaScript编译设置及浏览器自动刷新功能,助您快速搭建高效的前端开发环境。

codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

REAPER macOS版
REAPER macOS版
Mac

REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

Ableton Live macOS版
Ableton Live macOS版
Mac

Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。