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

大文件断点上传 js+php的更多相关文章

  1. Android应用开发之使用Socket进行大文件断点上传续传

    http://www.linuxidc.com/Linux/2012-03/55567.htm http://blog.csdn.net/shimiso/article/details/8529633 ...

  2. asp.net 如何实现大文件断点上传功能?

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  3. Android中Socket大文件断点上传

    原文:http://blog.csdn.net/shimiso/article/details/8529633 什么是Socket? 所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一 ...

  4. ASP.NET大文件断点上传

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

  5. formdata方式上传文件,支持大文件分割上传

    1.upload.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <h ...

  6. PHP + JS 实现大文件分割上传

    服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...

  7. js实现大文件分片上传的方法

    借助js的Blob对象FormData对象可以实现大文件分片上传的功能,关于Blob和FormData的具体使用方法可以到如下地址去查看FormData 对象的使用Blob 对象的使用以下是实现代码, ...

  8. Node + js实现大文件分片上传基本原理及实践(一)

    _ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...

  9. js大文件分块上传断点续传demo

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

随机推荐

  1. MongoDB的增、删、改、查操作(五)

    按照我们关系型数据库的思想,一个服务器要想存放数据,首先要有数据库,表,字段,约束,当然了也少不了主键,外键,索引,关系等: 但是在MongoDB的世界里边,我们不用预先的去创建这些信息从而直接来使用 ...

  2. eval详解

    eval()的作用 把字符串参数解析成js代码并运行,并返回执行的结果: eval的作用域 作用域在它所有的范围内容有效 IE8及以下指向window 解决方法: functiona(){ if(wi ...

  3. 队列 和 线程 之GCD dispatch

    1.dispatch_queue_create  创建队列开启异步线程(1,4,2,3) // 创建一个队列 dispatch_queue_t queue = dispatch_queue_creat ...

  4. BCH/BSV coin split troubleshooting

    BCH/BSV coin split troubleshootingMark Lundeberg 2018 November 27ResourcesGuides:Locktime based spli ...

  5. 24.Mysql高级安装和升级

    24.Mysql高级安装和升级24.1 Linux/Unix平台下的安装 24.1.1 安装包比较Linux下的Mysql安装包分为RPM包.二进制包.源码包3种.RPM包优点是安装简单,适合初学者: ...

  6. win10上VMare安装Centos7并使用Xshell连接Centos

      一.CentOS 使用VMware虚拟机如何上网 1.宿主机的虚拟网关VMnet8的IP设置为自动获取. (1)打开控制面板:“控制面板” ---> “网络和 Internet” ---&g ...

  7. svg 配合cesium使用

    ---恢复内容开始--- 1.svg简介 在 2003 年一月,SVG 1.1 被确立为 W3C 标准. 参与定义 SVG 的组织有:太阳微系统.Adobe.苹果公司.IBM 以及柯达. 与其他图像格 ...

  8. Luogu 2812 校园网络 - Tarjan

    Description 给出一个有向图, 要求出至少从哪几个点出发, 能不漏地经过所有节点. 再求出至少加几条边, 才能使图变成一个强联通分量 Solution 求出所有强联通分量, 形成一个有向无环 ...

  9. CButtonST|CUniButton等按钮类的使用

    CButtonST CButtonST类的使用参考链接:http://www.cnblogs.com/lidabo/archive/2012/12/17/2821122.html CCeButtonS ...

  10. POJ 3169.Layout 最短路

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11612   Accepted: 5550 Descripti ...