PHP 接收文件分片上传数据,写入数据时数据丢失

前端:
通过ajax 利用 new FormData()来传输分片的数据流,

后端php接收

    $fileD = request()->file('file'); // 分片二进制数据
    $token = request()->post("token"); // 唯一标识
    $chunkIndex = request()->post("index"); 分片编号
    $isMerge = request()->post("type"); // 是否传送完,
    $chunkCount = request()->post("chunkCount"); 总的分片
    $mergeFileName = request()->post("filename"); //文件名

     // 文件上传地址
     $basename = Env::get('root_path') . 'public' . DIRECTORY_SEPARATOR . 'temps' . DIRECTORY_SEPARATOR.$token;
    if($isMerge != 'merge') {
                         
        $fileUrl = $basename.DIRECTORY_SEPARATOR.$token."_".$chunkIndex; //分片编号
      
        if (!file_exists($basename)){

            mkdir ($basename,0777,true);
        }

        $newFile = fopen($fileUrl,"wb"); //打开或创建文件准备写入

        fwrite($newFile,$fileD); //写入二进制流到文件
        fclose($newFile); //关闭文件

    }else if($isMerge == 'merge') {

    
        $fileName = $basename.DIRECTORY_SEPARATOR.$mergeFileName;

        $newFile  = fopen($fileName,"wb"); //打开或创建文件准备写入

        $blob = '';
        for ($i= 0; $i < $chunkCount; $i++) { 

            $chunkFile = $basename.DIRECTORY_SEPARATOR.$token."_".$i;

            $cf = fopen($chunkFile,"rb"); 

            $cd = fread($cf,filesize($chunkFile)); //读取

            fwrite($newFile,$cd); //写入二进制流到文件

            fclose($cf); //关闭文件
        }

        fclose($newFile); //关闭文件 

    }
    exit();
    

分片数据流传到后端的数据大小是对的,但是php在写入的时候,看了下文件大小只有几个字节的大小,很多数据都丢失了。所以最后合成的图片总是报损坏错误

阅读 2.7k
1 个回答

你这if判断,明显丢了最后一次的传过来的file啊

我之前写过一个和你这个逻辑类似的demo,你可以参考下
https://github.com/jayding8/b...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题