当我们上传大文件时,可能会因为服务器原因导致文件上传失败。当文件过大时,由于服务器配置或响应事件过长导致上传文件失败。这时候我们可以把一个大文件分成几个块。然后将它们批量上传到服务器。当所有的文件块都上传完后,服务器会将每个文件块整合到我们上传的文件中1:块上传过程:1:前端js会将上传的文件信息切割成若干块,然后上传若干块文件块循环发送给服务器2:服务器收到文件块信息后保存,当所有文件块上传完成后,将所有上传的文件块整合成一个文件保存2:实现代码:1:HTML上传进度:2:JS//获取节点varfileForm=document.getElementById("file");varuploadBtn=document.getElementById('upload');varstopBtn=document.getElementById('stop');varrestartBtn=document.getElementById('restart');//定义常量constLENGTH=100*1024;//每个上传文件的块大小(100KB)varstart=0;varend=LENGTH+start;varblob;varis_stop=0;varblob_num=1;varfile=null;varupload_instance=newUpload();//上传事件uploadBtn.onclick=function(){upload_instance.addFileAndSend(fileForm);返回false;}stopBtn.onclick=function(){upload_instance.stop();returnfalse;}restartBtn.onclick=function(){upload_instance.start();returnfalse;}functionUpload(){//判断浏览器类型if(window.XMLHttpRequest){//IE7+,Firefox,Chrome,Opera,Safarivarxhr=newXMLHttpRequest();}else{//IE6,IE5varxhr=newActiveXObject("Microsoft.XMLHTTP");this}//上传文件.addFileAndSend=function(that){file=that.files[0];blob=cutFile(文件);//上传uploadFile(blob,file);blob_num+=1;}//停止文件上传this.stop=function(){xhr.abort();is_stop=1;}this.start=function(){uploadFile(blob,文件);is_stop=0;}//剪切文件functioncutFile(file){varfile_blob=file.sl(start,end);开始=结束;结束=开始+长度;返回file_blob;};//上传文件functionuploadFile(blob,file){varform_data=newFormData();vartotal_blob_num=Math.ceil(file.size/LENGTH);//上传文件信息form_data.append('file',blob);//上传前几个文件块form_data.append('blob_num',blob_num);//文件块总数form_data.append('total_blob_num',total_blob_num);//文件名form_data.append('file_name',file.name);.php',假);xhr.onreadyStateChange=Function(){//获取上传进度if(total_blob_num==1){propressext='100%';Total_blob_num)*100)).TOFIXED(2)+'%';}VarProgress=Document.GetelementByid('Progress');Progress.innerhtml=Progresstext;setTimeout(function(){if(startfilepath=$filepath;$this->tmpPath=$tmpPath;$this->blobNum=$blobNum;$this->totalBlobNum=$totalBlobNum;姓名;//保存文件块$this->moveFile();//保存文件$this->fileMerge();}privatefunctionfileMerge(){//当文件块上传完成后,将文件块合并成一个文件if($this->blobNum==$this->totalBlobNum){for($i=1;$i<=$this->totalBlobNum;$i++){$blob='';文件路径。'/'。$this->fileName.'__'.$i);file_put_contents($this->filepath.'/'.$this->fileName,$blob,FILE_APPEND);取消设置($blob);}//删除一个文件块$this->deleteFileBlob();}}}//删除一个文件块privatefunctiondeleteFileBlob(){for($i=1;$i<=$this->totalBlobNum;$i++){link@un($this->filepath.'/'.$this->fileName.'__'.$i);}}}私有函数moveFile(){$this->touchDir();$filename=$this->文件路径。'/'.$this->fileName.'__'.$this->blobNum;//保存文件块move_uploaded_file($this->tmpPath,$filename);}//上传返回publicfunctionuploadReturn(){if($this->blobNum==$this->totalBlobNum){if(file_exists($this->filepath.'/'.$this->fileName)){return['code'=>2,'message'=>'success','file_path'=>'http://'.$_SERVER['HTTP_HOST'].str_replace('.','',$this->文件路径)。'/'。$this->fileName,'local_path'=>str_replace('.','',$this->filepath).'/'.$this->文件名];}}返回['code'=>1,'message'=>'waiting',];}/***创建目录*/私有函数touchDir(){if(!file_exists($this->filepath)){returnmkdir($this->filepath);}}}调用上传类$tmpName=$_FILES['file']['tmp_name'];$blobNum=$_POST['blob_num'];$totalBlobNum=$_POST['total_blob_num'];$fileName=$_POST['file_name'];$upload=newUpload($tmpName,$blobNum,$totalBlobNum,$fileName);$data=$upload->uploadReturn();header('内容类型:application/json');返回json_encode($data);按照以上步骤,就可以实现将文件分块上传的功能了