大文件断点上传 js+php

/*
* js
*/
function
PostFile(file, i, t) {      console.log(1);    var name = file.name,   //文件名   size = file.size,   type = file.type,   //总大小shardSize = 2 * 1024 * 1024,   shardSize = 2 * 1024 * 1024,   //以2MB为一个分片,每个分片的大小   shardCount = Math.ceil(size / shardSize);  //总片数        if (i >= shardCount) {     return;   }     //console.log(size,i+1,shardSize);  //文件总大小,第一次,分片大小//        var start = i * shardSize;       var end = start + shardSize;       var packet = file.slice(start, end);  //将文件进行切片   /*  构建form表单进行提交  */        var form = new FormData();       form.append("data", packet); //slice方法用于切出文件的一部分        form.append("lastModified", file.lastModified); //最后的额修改时间        form.append("name", name);       form.append("type", type);       form.append("totalsize", size);       form.append("total", shardCount); //总片数        form.append("index", i + 1); //当前是第几片   form.append("_cfs", $.cookie('_cfc'));       $.ajax({           formData: {     _cfs: $.cookie('_cfc')     },     url: uploaddo_url,     type: "POST",     data: form,     //timeout:"10000",   async: true, //异步     dataType: "json",     processData: false, //很重要,告诉jquery不要对form进行处理     contentType: false, //很重要,指定为false才能形成正确的Content-Type     success: function(msg) {                    console.log(msg.status);         /*  表示上一块文件上传成功,继续下一次  */                if (msg.status == 201) {             form = '';                   i++;                   PostFile(file, i, t);          } else if (msg.status == 502) {                   form = '';           /*  失败后,每2秒继续传一次分片文件  */                    setInterval(function() { PostFile(file, i, t) }, 2000);                 console.log("上传失败");       } else if (msg.status == 200) {         console.log("上传成功");                } else if (msg.status == 500) {         console.log('第' + msg.i + '次,上传文件有误!');       } else {          console.log('未知错误');       }           },     error: function(msg) {       console.log(2);       console.log(msg.status);     }   })    }

php代码示例

public function video(){
        
        $files = $_FILES['data'];
        
        $arr['i'] = $this->input->post('index');
        $arr['shardCount'] = $this->input->post('total');
        $arr['totalsize'] = $this->input->post('totalsize');
        $arr['fileName'] = $this->input->post('name');
        $arr['type'] = $this->input->post('type');
        
        

        if($files['error'] > 0) {
            $arr['status'] = 502;
            exit(json_encode($arr));
        }
        
        
        /*  检测第一次上传的时候已经有同文件时,删除原来的文件  */
        if ($arr['i'] == 1 && is_file(UPLOAD_PATH. $arr['fileName']) && filesize(UPLOAD_PATH. $arr['fileName']) == $arr['totalsize']){
            unlink(UPLOAD_PATH. $arr['fileName']);
        }
        
        
        // 否则继续追加文件数据
        if (!file_put_contents(UPLOAD_PATH.$arr['fileName'],file_get_contents($files['tmp_name']),FILE_APPEND)) {
            $arr['status'] = 501;
            exit(json_encode($arr));
        }
        
        // 在上传的最后片段时,检测文件是否完整(大小是否一致)
        if ($arr['i'] == $arr['shardCount']) {
            if(filesize(UPLOAD_PATH. $arr['fileName']) == $arr['totalsize']){
                $arr['status'] = 200;
                $this->CI =& get_instance();
                $this->CI->load->library('OssLibrary');
                $files = array();
                $content = file_get_contents(UPLOAD_PATH. $arr['fileName']);
                $files[] = OssLibrary::putObject($content, $arr['fileName'], $arr['totalsize'], $arr['type']);
                if ($files) {
                    unlink(UPLOAD_PATH. $arr['fileName']);
                    // 插入数据库
                    $this->db_isnert($files);
                }
                $arr['data'] = $files;
                
            }else{
                $arr['status'] = 501;
            }
            exit(json_encode($arr));
        }
        $arr['status'] = 201;
        exit(json_encode($arr));
        
    }

 

function PostFile(file, i, t) {   
console.log(1); 
var name = file.name,
//文件名
size = file.size,
type = file.type,
//总大小shardSize = 2 * 1024 * 1024,
shardSize = 2 * 1024 * 1024,
//以2MB为一个分片,每个分片的大小
shardCount = Math.ceil(size / shardSize);  //总片数
    
if (i >= shardCount) {
return;
}     //console.log(size,i+1,shardSize);  //文件总大小,第一次,分片大小//
    
var start = i * shardSize;    
var end = start + shardSize;    
var packet = file.slice(start, end);  //将文件进行切片
     /*  构建form表单进行提交  */     
var form = new FormData();    
form.append("data", packet); //slice方法用于切出文件的一部分
    
form.append("lastModified", file.lastModified); //最后的额修改时间
    
form.append("name", name);    
form.append("type", type);    
form.append("totalsize", size);    
form.append("total", shardCount); //总片数
    
form.append("index", i + 1); //当前是第几片
form.append("_cfs", $.cookie('_cfc'));    
$.ajax({      
formData: {
_cfs: $.cookie('_cfc')
},
url: uploaddo_url,
type: "POST",
data: form,
//timeout:"10000",
async: true, //异步
dataType: "json",
processData: false, //很重要,告诉jquery不要对form进行处理
contentType: false, //很重要,指定为false才能形成正确的Content-Type
success: function(msg) {
progressall(i + 1, shardCount);        
console.log(msg.status);         /*  表示上一块文件上传成功,继续下一次  */         
if (msg.status == 201) {    
form = '';          
i++;          

PostFile(file, i, t);   
} else if (msg.status == 502) {          
form = '';           /*  失败后,每2秒继续传一次分片文件  */           
setInterval(function() { PostFile(file, i, t) }, 2000);        
console.log("上传失败");
} else if (msg.status == 200) {

console.log("上传成功");
done(msg.data, t)
} else if (msg.status == 500) {
console.log('第' + msg.i + '次,上传文件有误!');
} else
console.log('未知错误');
}      
},
error: function(msg) {
console.log(2);
console.log(msg.status);
}
})  
}
posted @ 2018-12-20 15:14  飞翔的贺兰猪  阅读(684)  评论(0编辑  收藏  举报