Laravel大文件分块上传需从前端分片、服务端原子写入、流式合并、Redis断点续传及自动化清理五方面实现:前端用File.slice()切片并携带SHA-256标识与序号;服务端直读HTTP body流并加锁写入临时目录;合并时调用cat命令流式拼接;Redis记录已传分片支持续传;上传后自动清理临时文件并配置Nginx client_max_body_size。

如果您在Laravel中尝试上传大文件(如视频、备份包等),但遭遇超时、内存溢出或413错误,则很可能是PHP或Web服务器限制了单次请求体积,且未启用分块机制。以下是基于存储层安全、高效、可扩展的分块上传实现方法:
一、前端分片与元数据携带
该方法确保服务端能准确识别、定位和重组每个分片,避免命名冲突与覆盖,同时为断点续传提供基础支撑。关键在于将文件哈希作为核心标识符,并严格传递分片序号与总数。
1、使用File.slice()按固定大小(例如5MB)切分原始文件,生成有序分片数组。
2、计算整个文件的SHA-256哈希值,作为fileIdentifier,不依赖文件名或时间戳,防止重复上传相同内容。
3、每个分片请求携带四个必需字段:identifier(SHA-256)、chunkNumber(从0开始递增)、totalChunks(总片数)、filename(原始名称,用于最终落盘)。
4、使用fetch发送二进制流(非FormData),设置headers为{'Content-Type': 'application/octet-stream'},避免multipart解析开销。
二、服务端接收分片并原子写入临时存储
此方法绕过Laravel默认的$request->file()机制,直接读取原始HTTP body流,规避PHP内存加载整个分片的风险,同时保证写入的原子性与路径隔离。
1、定义路由POST /api/upload/chunk,控制器中校验identifier、chunkNumber、totalChunks均为非空且为整型。
2、调用$request->getContent()获取原始二进制流,禁止使用$request->file('file')——该方式会触发PHP完整解析multipart,极易OOM。
3、构造分片存储路径为storage_path("app/chunks/{$identifier}/{$chunkNumber}"),使用mkdir(..., 0755, true)确保父目录存在。
4、执行file_put_contents($filePath, $content, LOCK_EX),加独占锁防止并发写入同一分片导致损坏。
三、基于文件系统命令的流式合并(低内存占用)
该方法将合并操作交由操作系统内核处理,完全避开PHP内存加载全部分片内容,适用于GB级文件,避免Storage::put()引发的进程卡死。
1、收到客户端发起的/api/upload/merge?identifier=xxx请求后,先确认Redis中uploaded_chunks:{$identifier}计数值等于totalChunks。
2、遍历storage/app/chunks/{$identifier}/目录下所有分片文件,按chunkNumber升序排序,验证每个文件size > 0。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
3、拼接shell命令:cat storage/app/chunks/{$identifier}/* > storage/app/uploads/{$finalName},通过exec()或Process组件执行。
4、执行前必须确保web用户(如www-data)对chunks/和uploads/目录具有rwx权限,且磁盘剩余空间大于目标文件预期大小。
四、基于Redis状态管理的断点续传支持
该方法使上传过程具备可恢复性,客户端可在中断后查询已成功上传的分片索引,跳过重传,提升用户体验与带宽效率。
1、分片写入成功后,立即执行Redis::sAdd("uploaded_chunks:{$identifier}", $chunkNumber)记录索引。
2、提供GET /api/upload/chunks/{identifier}接口,返回JSON数组如[0,1,2,4],不查磁盘而查Redis Set,保障高并发响应速度。
3、合并完成后,执行Redis::del("uploaded_chunks:{$identifier}")清除状态键。
4、为防状态残留,所有Redis键必须设置EXPIRE,例如SETEX uploaded_chunks:abc 86400 [0,1,2]。
五、分片清理与权限校验自动化
该方法防止临时分片长期滞留磁盘造成空间耗尽,同时建立最小权限模型,降低因目录误配置引发的安全风险。
1、合并成功后,递归删除storage/app/chunks/{$identifier}/目录,使用Filesystem::deleteDirectory()而非shell rm -rf。
2、在AppServiceProvider@register()中注册artisan命令php artisan upload:cleanup,扫描chunks/下超过24小时未被合并的目录并清理。
3、部署时运行chmod -R 755 storage/app/chunks storage/app/uploads,再执行chown -R www-data:www-data storage/app/chunks storage/app/uploads。
4、Nginx配置必须包含client_max_body_size 128m;,否则分片请求在到达PHP前即被拒绝,返回413错误。










