/*
* 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);

}                             })                           }

DEMO下载地址:https://dwz.cn/fgXtRtnu

最新文章

  1. OneThink开发框架
  2. JavaWeb 学习003-简单登录页面功能实现
  3. linux /usr/bin/ld: cannot find -lxxx
  4. apache2.4的安装与卸载
  5. 云计算服务模型,第 3 部分: 软件即服务(PaaS)
  6. [设计模式]<<设计模式之禅>>关于依赖倒置原则
  7. 创业公司Playcafe关门大吉 创始人总结10大失败教训
  8. Ecshop图片不清晰怎么办?
  9. hadoop-2.6.0为分布式安装
  10. VB.NET 结构(Structure)和类(Class)的区别
  11. JavaScript之包装对象
  12. beanutils中Lazy
  13. spring-dwr注解整合
  14. Java实现zip压缩文件的解压
  15. POJ 1284:Primitive Roots(素数原根的个数)
  16. Uva10474-STL水题-白书
  17. Android 实现简单 倒计时60秒,一次1秒
  18. pdo的用处,用法
  19. Qt Creator在Windows上的调试器安装与配置
  20. EF直接的一對多多對多多對一的關係----也即是鏈錶查詢

热门文章

  1. ES6解构赋值的应用场景
  2. hdu 1394(线段树) 最小逆序数
  3. iOS.Crash.OniOS8.WhenCall[popToRootViewController]
  4. (O)阻止默认事件和阻止冒泡的应用场景
  5. LaTeX数学公式大全
  6. 在开发node.js中,关于使用VS2013插件出现一直读取资源的问题
  7. 使用Loadrunner对IBM MQ进行性能测试
  8. Ubuntu中文乱码问题解决方案
  9. Servlet 3.0 规范(二)注解驱动和异步请求
  10. 后期生成事件命令copy /y