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

Workerman4Http 上传文件,大文件分片上传后端逻辑编写

酷雪大大_2403

酷雪大大_2403

发布时间:2026-10-09 14:29:28

|

826人浏览过

|

来源于php中文网

原创

Workerman4Http实现大文件分片上传需手动解析请求体,用application/octet-stream传输二进制分片,Redis管理元数据,按序合并并自动清理过期分片。

workerman4http 上传文件,大文件分片上传后端逻辑编写

Workerman4Http 实现大文件分片上传,核心在于:前端按固定大小切片、携带分片序号和唯一标识(如 file_id 或 upload_id),后端接收后暂存分片、校验完整性、合并为完整文件。关键不是“能不能传”,而是“如何可靠地收、存、合、清”。

分片上传的后端接收逻辑

Workerman4Http 是基于 WorkerMan 的轻量 HTTP 服务,不依赖 PHP-FPM,因此不能用 $_FILES 原生处理(无 CGI 环境)。需手动解析 multipart/form-data 请求体:

  • 使用 Workerman\Http\Request::post() 获取普通字段(如 file_id、chunk_index、total_chunks、filename)
  • 通过 $request->rawBody() 获取原始请求体,配合 strtok() 或第三方库(如 symfony/mime)提取文件字段中的二进制数据
  • 更推荐方式:前端改用 application/octet-stream + URL 参数传元信息,例如:
    POST /upload?file_id=abc123&chunk_index=0&total_chunks=12
    此时 $request->rawBody() 就是纯分片二进制流,直接写入临时目录(如 runtime/chunks/abc123_0)

分片存储与去重校验

避免同一文件重复上传或分片错乱,需建立轻量元数据管理:

  • 每个 file_id 对应一个上传会话,记录:filename、total_chunks、received_chunks(数组或 Redis Set)、chunk_size(可选)
  • 使用 Redis 存储元数据(速度快、支持原子操作),例如:
    hset upload:abc123 filename "report.pdf" total_chunks 12
    sadd upload:abc123:chunks 0 1 2
  • 每次接收分片前,先查 upload:abc123 是否存在且未完成;已存在的分片直接跳过(幂等),防止重复写入

合并分片与清理机制

当收到最后一个分片(chunk_index == total_chunks - 1)时触发合并:

  • 按序读取所有已接收分片文件(runtime/chunks/abc123_0 → abc123_11),用 fopen(..., 'wb') 创建目标文件,逐个 fread + fwrite 拼接
  • 合并成功后:删除所有分片文件、清除 Redis 中的 upload:abc123* 键、返回最终文件路径或访问 URL
  • 增加超时自动清理:Redis 设置 EXPIRE upload:abc123 7200(2小时),后台定时任务扫描过期 key 并清理残留分片

错误处理与前端协同建议

分片上传失败率高,后端必须提供可探测的恢复能力:

  • 提供 GET /upload/status?file_id=abc123 接口,返回当前已上传分片列表和总数量,供前端断点续传
  • 对非法请求(缺失参数、越界索引、MD5 不匹配)统一返回 JSON 错误,如:{"code":400,"msg":"chunk_index out of range"}
  • 生产环境务必限制单个分片大小(如 5MB)、总文件上限(如 2GB)、并发上传数(通过 Redis 计数器限流),防内存/磁盘打满

Workerman4Http 分片上传不复杂但容易忽略细节——重点不在“一次传多大”,而在“每一片都收得稳、记得清、合得准、删得净”。

热门AI工具

更多
LibLibAI
LibLibAI Hot

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

WorkBuddy

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

墨刀AI
墨刀AI Hot

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

音述AI
音述AI Hot

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

DeepSeek

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

豆包大模型

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

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2363

2023.08.11

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

6170

2024.03.19

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

5506

2024.03.19

php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

10304

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6081

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2095

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3828

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4534

2023.10.23

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

0

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习

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

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