咨询电话:
15628812133
16
2019/08

php+html5实现无刷新上传,大文件分片上传,断点续传

发布时间:2019-08-16 18:08:31
发布者:小逗号
浏览量:
0

济南建站文汇软件小编来带大家了解下前端的切片断点上传

理清思路:
引入了两个概念:块(block)和片(chunk)。每个块由一到多个片组成,而一个资源则由一到多个块组成
块是服务端的永久数据存储单位,片则只在分片上传过程中作为临时存储的单位。服务端会以约一个月为单位周期性的清除上传后未被合并为块的数据片。

实现过程:
将文件分割,分片上传,然后合并。


前端代码:







Document





后台PHP代码:

tmpPath =  $tmpPath;
$this->blobNum =  $blobNum;
$this->totalBlobNum =  $totalBlobNum;
// 文件名编码
$this->fileName = iconv('utf-8','gbk', $fileName);
$this->moveFile();
$this->fileMerge();
}
//判断是否是最后一块,如果是则进行文件合成并且删除文件块
private function fileMerge(){
if($this->blobNum == $this->totalBlobNum){
$blob = '';
for($i=1; $i<= $this->totalBlobNum; $i++){
$blob = file_get_contents($this->filepath.'/'. $this->fileName.'__'.$i);
file_put_contents($this->filepath.'/'. $this->fileName,$blob,FILE_APPEND);
}
$this->deleteFileBlob();
}
}
//删除文件块
private function deleteFileBlob(){
for($i=1; $i<= $this->totalBlobNum; $i++){
@unlink($this->filepath.'/'. $this->fileName.'__'.$i);
}
}
//移动文件
private function moveFile(){
$this->touchDir();
$filename = $this->filepath.'/'. $this->fileName.'__'.$this->blobNum;
move_uploaded_file($this->tmpPath,$filename);
}
//API返回数据
public function apiReturn(){
if($this->blobNum == $this->totalBlobNum){
if(file_exists($this->filepath.'/'. $this->fileName)){
$data['code'] = 2;
$data['msg'] = 'success';
$data['file_path'] = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_FILENAME']).str_replace('.','',$this->filepath).'/'. $this->fileName;
$data['blobNum'] = $this->blobNum;
$data['totalBlobNum'] = $this->totalBlobNum;
}
}else{
if(file_exists($this->filepath.'/'. $this->fileName.'__'.$this->blobNum)){
$data['code'] = 1;
$data['msg'] = 'waiting for all';
$data['file_path'] = '';
$data['blobNum'] = $this->blobNum;
$data['totalBlobNum'] = $this->totalBlobNum;
}
}
header('Content-type: application/json');
echo json_encode($data);
}
//建立上传文件夹
private function touchDir(){
if(!file_exists($this->filepath)){
return mkdir($this->filepath);
}
}
}
if (!isset($_POST['blob_num'])) {
exit("error");
}

//实例化并获取系统变量传参
$upload = new Upload($_FILES['file']['tmp_name'],$_POST['blob_num'],$_POST['total_blob_num'],$_POST['file_name']);
//调用方法,返回结果
$upload->apiReturn();
?>

亲测有效,有兴趣的同学可以自己动手实践下。   希望这个小知识可以对你有所帮助,然后给济南文汇软件小编点个赞再走呗!

关键词:
返回列表