当前位置: 首页 > 后端技术 > PHP

关于上传大文件

时间:2023-03-30 00:49:30 PHP

关于大文件上传思路用js读取表单中选中的文件,计算文件的md5值,将md5值上传到服务器,检查文??件是否已经上传(类似到即时传输功能)如果文件还没有上传的话,会根据它的大小被切割成1MB的块。如果小于1MB,可以不用ajax异步提交切块上传到服务器(一个请求一个块,非阻塞,多线程)。当所有块上传完成后,发起合并文件请求,服务器合并之前上传的文件块,合并完成后上传完成。实现js计算文件md5使用spark-md5.js,据说这个库使用了世界上最快的md5算法。js将文件切片并使用ajax上传切片:letsize=file.size;//获取文件大小constshardSize=1024*1024;//块大小1MBletshardCount=Math.ceil(size/shardSize);//可以分片的块数for(leti=0;i0){echojson_encode(['code'=>400,'msg'=>$file["error"]]);die;}else{$res=move_uploaded_file($file['tmp_name'],$dst_file);如果($res){file_put_contents($dst_file.'.info',$size);//切片上传成功,写入一个文件保存其大小,后续合并用于验证文件echojson_encode(['code'=>200,'msg'=>'shardok']);die;}else{echojson_encode(['code'=>400,'msg'=>'shardmove_uploaded_fileerror']);die;}}phpsidemergefunctionmergeFile($name,$total,&$msg){//验证切片文件是否上传完成for($i=0;$i<$total;$i++){if(!file_exists($name.'-'.$total.':'.$i.'.info')||!file_exists($name.'-'.$total.':'.$i)){$msg="分片错误$i";返回假;}elseif(filesize($name.'-'.$total.':'.$i)!=file_get_contents($name.'-'.$total.':'.$i.'.info')){$msg="分片大小错误$i";返回假;}}@unlink($名称);if(file_exists($name.'.lock')){//加锁防止其他进程写入文件,造成文件损坏$msg='onlock';返回假;}touch($name.'.lock');$file=fopen($name,'a+');for($i=0;$i<$total;$i++){//按切片顺序写入File$shardFile=fopen($name.'-'.$total.':'.$i,'r');$shardData=fread($shardFile,filesize($name.'-'.$total.':'.$i));fwrite($文件,$shardData);fclose($shardFile);取消链接($name.'-'.$total.':'.$i);取消链接($name.'-'.$total.':'.$i.'.info');}fclose($文件);取消链接($name.'.lock');returntrue;}我也写了一个demo,传送门下方这是这个demo的效果图:这个demo有些地方还不够完善,我们继续完善吧~原文链接:更多关于上传大文件的知识点分享,请扫描二维码关注微信公众号: