WebUploader与ThinkPHP对接需区分单文件和分片上传:单文件用$request->file()解析,分片则须用file_get_contents('php://input')读原始流,按chunk/chunks参数存临时块并校验顺序,最后合并;须调大PHP上传限制、避免补零写入、加锁防并发、关闭自动验证、响应JSON确保状态同步。

WebUploader 与 ThinkPHP 后端怎么接通
WebUploader 是前端上传控件,ThinkPHP 是后端框架,两者不自动互通。关键在「前端传什么、后端收什么、怎么校验、怎么存」。WebUploader 默认用 multipart/form-data 提交单文件,但大文件分片时走的是 POST 原始二进制流(input('raw', '', null, false) 才能拿到),这点最容易卡住。
- 单文件上传:ThinkPHP 的
$request->file()能直接解析,和普通表单一样 - 分片上传(
chunked: true):WebUploader 发送的是纯二进制块,$request->file()返回空,必须用file_get_contents('php://input')读原始体,再按chunk、chunks、name等参数拼路径 - 务必检查 ThinkPHP 的
upload_max_filesize和post_max_size(php.ini),WebUploader 分片默认每块 5MB,100MB 文件会发 20 次请求,但单次 POST 体仍受限制
ThinkPHP 接收 WebUploader 分片的正确写法
分片上传不是“把 chunk 存完再合并”,而是边收边校验、防重复、防错序。ThinkPHP 没有内置分片合并逻辑,得自己写。核心是三件事:确认当前块索引、检查是否已存在、写入临时位置。
- WebUploader 发送的分片参数:
chunk(当前块序号,从 0 开始)、chunks(总块数)、name(原始文件名)、file(实际字段名,常为file或blob) - 不要用
$request->file('file')读分片——它只处理multipart,分片是 raw body - 用
file_get_contents('php://input')读取原始数据,配合file_put_contents($tmpPath, $data, FILE_APPEND)追加写入临时文件 - 合并时机:当收到最后一块(
chunk == chunks - 1)时,调用mergeChunks()函数,用rename()或file_put_contents()把所有块按序 cat 成完整文件
为什么上传成功但文件损坏或大小不对
常见于分片场景,本质是块写入顺序错乱或末尾补零。WebUploader 在最后一块可能 padding 不足(比如 4.8MB 块 + 0.2MB 补零凑 5MB),但 ThinkPHP 如果直接 file_put_contents(..., FILE_APPEND),就会把补零也写进去。
- 必须用
$_POST['chunk']和$_POST['chunks']严格对应块序号,不能依赖接收顺序(HTTP 不保证) - 最后一块的实际大小要从
$_SERVER['CONTENT_LENGTH']或strlen(file_get_contents('php://input'))获取,不能硬写 5MB - 临时分片目录权限要可写,且需加锁(如
flock())避免并发上传同名文件时写花 - ThinkPHP 的
moveTo()不适用于分片合并后的文件重命名——它会触发验证,而合并后的文件不在$_FILES中,应直接rename()
高性能配置的关键开关
WebUploader 高性能不靠前端单点优化,而在于服务端减少阻塞、避免磁盘抖动、跳过非必要中间环节。ThinkPHP 默认上传流程含验证、移动、重命名三层,分片场景下全得绕开。
- 关闭 ThinkPHP 自动上传验证:不要调用
$file->validate(),分片阶段无法校验完整文件类型和大小 - 临时目录设为内存盘(如
/dev/shm)或 SSD 路径,避免 HDD 寻道拖慢分片写入 - 合并后立即计算
md5_file()校验,而不是等前端再次请求 —— WebUploader 的md5参数只是文件名哈希,不是内容哈希 - 响应必须返回 JSON,且含
status: 200和chunk: N,否则 WebUploader 会重试,导致重复写入
分片上传真正难的不是代码量,而是状态同步:前端认为“上传完成”和后端“文件落盘完成”之间存在时间差,这个窗口期一旦崩溃或网络中断,就得靠 checkChunk 接口恢复,而 ThinkPHP 默认不提供这个接口——得自己写,且必须原子化判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











