本文实例讲述了php+ajax实现文件切割上传功能。分享给大家供大家参考,具体如下:

html5中的file对象继承blob二进制对象,blob提供了一个slice函数,可以用来切割文件数据。

<!doctype html>
<html lang="zh-cn">
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body>
  <form method="post" id="myform">
    <input type="file" name="file" id="upfile" />
    <input type="submit" name="submit" value="提交" />
  </form>
  <div id="upstatus"></div>
</body>
<script type="text/javascript">
  var myform = document.getelementbyid("myform");
  var upfile = document.getelementbyid("upfile");

  myform.onsubmit = function() {
    //获取文件对象
    var file = upfile.files[0];
    //获取文件大小
    var filesize = file.size;
    //一次截取的大小(字节)
    var cutsize = 1024 * 1024 * 10;
    //开始截取位置
    var cutstart = 0;
    //结束截取位置
    var cutend = cutstart + cutsize;
    //截取的临时文件
    var tmpfile = new blob();

    while(cutstart < filesize) {
      tmpfile = file.slice(cutstart, cutend);

      //我们创建一个formdata对象
      var fd = new formdata();
      //把文件添加到formdata对象中
      fd.append("file", tmpfile);

      var xhr = new xmlhttprequest();
      //这里使用同步
      xhr.open("post", "upfile.php", false);

      //上传进度
      console.log(math.round( (cutstart + tmpfile.size) / filesize * 100) + "%");

      //发送formdata对象
      xhr.send(fd);
      //重新设置截取文件位置
      cutstart = cutend;
      cutend = cutstart + cutsize;
    }
    return false;
  };
</script>
</html>

upfile.php代码如下:

<?php
$uploaddir = './upload/';
if(!file_exists($uploaddir)) {
  @mkdir($uploaddir, 0777, true);
}
$uploadfile = $uploaddir . basename($_files['file']['name']);

if(!file_exists($uploadfile)) {
  //如果文件不存在
  move_uploaded_file($_files['file']['tmp_name'], $uploadfile);
} else {
  //如果文件已存在,追加数据
  file_put_contents($uploadfile, file_get_contents($_files['file']['tmp_name']), file_append);
}