/*
* 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. jsplumb流程器使用2

    jsplumb默认注册在浏览器的窗口,为整个页面提供静态实例 1. 单独实例化的方法: var firstInstance = jsPlumb.getInstance(); 内部传入可定义对象   全 ...

  2. go语言使用go-sciter创建桌面应用(四) 固定窗口大小

    有些时候我们需要创建的应用窗口大小不可改变. demo5.go代码如下: package main; import ( "github.com/sciter-sdk/go-sciter/wi ...

  3. Struts2把数据封装到集合中之封装到map中

    struts框架封装数据可以封装到集合中也可以封装到map中,该篇博客主要讲解将数据封装到map中. 1. 封装复杂类型的参数(集合类型 Collection .Map接口等) 2. 需求:页面中有可 ...

  4. linux操作系统-源码包安装jdk1.7

    1.下载安装文件 在oracle官方找不到bin二进制安装文件只能使用rpm包来安装 下载地址:http://www.oracle.com/technetwork/java/javase/downlo ...

  5. Python.tornado.2.tornado.options

    记录Tornado-4.0.2源码的阅读,学习,分析 options.py 1. imports 部分 1.1 __future__ from __future__ import absolute_i ...

  6. python基础易错题

    1.以下代码输入什么: class Person: a = 1 def __init__(self): pass def getAge(self): print(__name__) p = Perso ...

  7. 2015-09-27 git学习

    创建 初始化 git init Initialized empty Git repository in <file> 关联 git remote add origin <git@se ...

  8. Java中多线程访问冲突的解决方式

    当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题. 第一种 同步方法 第二种 同步代 ...

  9. [Python] Python教程

    http://www.runoob.com/python/python-tutorial.html  

  10. sqlserver 数据分发复制 发布订阅

    转载地址:https://www.cnblogs.com/lizejia/p/6062674.html