/*
* 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. vue-awesome-swiper轮播的使用

    一.安装vue-awesome-swiper npm install vue-awesome-swiper --save 二.引入插件 main.js里面分别引入(记得有些电脑要引入样式) impor ...

  2. Jenkins与SVN持续集成

    官网下载Jenkins&SVN&eclipse,版本号没要求,建议使用最新稳定版本 登录Jenkins:http://localhost:8080 登录SVN:http://local ...

  3. Oracle_高级功能(6) 分区

    oracle分区表1.分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区. 表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上 ...

  4. 去掉easyui datagrid内部虚线的方式。

    去掉easyui        datagrid内部虚线的方式.easyui datagrid的样式是统一写在样式文件中的,如果想要统一替换可以找对应的datagird样式文件中的以下部分.如果想要改 ...

  5. C#委托深入学习

    一基础学习: .Net delegate类型:委托跟回调函数是很有渊源的.回调其实跟通知机制有关,考虑这样一个基本的事件序列: a对象调用了b对象的某个方法,希望b对象在其方法完成之时调用a对象的某个 ...

  6. fis代码压缩

    Fis代码压缩步骤 1,安装fis(http://fis.baidu.com/fis3/docs/beginning/install.html) fis安装支持的node版本:0.8x,0.10x,0 ...

  7. 安全概念:DMZ(非军事化区,隔离区)

    DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,也称“非军事化区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间 ...

  8. 2019年学Java开发有优势吗?

    随着信息科技的发展,在我们的日程生活和工作中到处充斥和使用着互联网信息技术.事实说明,互联网已经越来越广泛地深入到人们生活的方方面面,Java技术服务市场需求空缺会越来越大.学会一门IT技术,将拥有更 ...

  9. java byte转string 涉及到字节流中有中文

    最近遇到一个问题,我用java写了一个客户端通过socket向服务器端发送消息,发送的内容是字节流,编码格式是GBK,服务器在收到消息后,如果格式正确,会返回固定的消息格式,同样也是字节流,编码格式也 ...

  10. Real-time qPCR So Easy?

    Real-time qPCR So Easy? [2016-05-27]       实时荧光定量PCR技术是在定性RCR技术基础上发展起来的核酸定量技术,于1996年由美国Applied biosy ...