使用Dropzone.js分片上传大视频文件时PHP端fwrite追加失效问题排查求助
Dropzone.js分片上传大视频文件时PHP端fwrite追加失效问题排查求助
嘿,我看你遇到了Dropzone分片上传大视频时PHP端追加文件没效果的问题,这事儿我之前做分片上传的时候也踩过类似的坑,咱们来一步步揪出问题所在~
首先看你代码里最关键的错误:追加文件时用了错误的文件打开模式!
你现在用的是 "w" 模式打开文件,这个模式的作用是清空原有文件内容,然后写入新内容——也就是说,当你处理第二个分片时,你先把第一个分片创建的文件清空了,再写新的分片内容,如果后续分片上传过程中出点小问题,最后就会留下0字节的空文件。
针对二进制文件(比如视频),咱们应该用追加模式,而且要加上二进制标记,也就是 "ab" 模式:
a:表示追加内容到文件末尾,不会清空原有内容b:表示以二进制模式操作,避免视频这类二进制文件出现编码或格式损坏
接下来给你修改后的代码,顺便加了点错误处理,避免静默失败:
$targetFile = $uploadPath . $uploadedFiles['videos']->getClientFilename(); if(file_exists($targetFile)) { // 用二进制追加模式打开文件 $file = fopen($targetFile, "ab"); if (!$file) { die("无法打开文件进行追加"); } $chunkContent = $uploadedFiles['videos']->getStream()->getContents(); $writeResult = fwrite($file, $chunkContent); if ($writeResult === false) { die("写入分片内容失败"); } fclose($file); } else { // 第一个分片,直接移动文件 $uploadedFiles['videos']->moveTo($targetFile); }
除此之外,还有几个地方可以排查下,避免其他潜在问题:
- 检查PHP配置:确认
upload_max_filesize和post_max_size的值大于你的分片大小,不然分片可能上传失败 - 磁盘权限:确保
$uploadPath目录有足够的写权限,服务器用户(比如www-data)能在这个目录创建和修改文件 - 磁盘空间:目标磁盘有没有剩余空间?如果空间满了,写入操作会静默失败
- Dropzone配置:确认Dropzone开启了分片模式(
chunking: true),并且传递了正确的分片序号等参数,虽然你说顺序正确,但还是确认下有没有遗漏必要的配置项
备注:内容来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

