PHP大文件分块上传功能实例详解


Posted in PHP onJuly 22, 2019

本文实例讲述了PHP大文件分块上传功能。分享给大家供大家参考,具体如下:

前端代码

使用file.slice将文件进行分割,然后分别进行异步上传。

<!DOCTYPE html>
<html lang="zh-cn">
 <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title><%= title %></title>
  <!-- zui -->
  <link rel="stylesheet" href="http://zui.sexy/dist/css/zui.min.css" rel="external nofollow" >
 </head>
 <body>
  <div class="container" style="margin-top: 30px;">
    <form class="form-inline" method="post" enctype="multipart/form-data">
     <div class="form-group">
      <input type="file" id="fileBig" class="form-control">
     </div>
     <button type="submit" class="btn btn-primary">提交</button>
    </form>
  </div>
  <!-- ZUI Javascript 依赖 jQuery -->
  <script src="http://zui.sexy/assets/jquery.js"></script>
  <!-- ZUI 标准版压缩后的 JavaScript 文件 -->
  <script src="http://zui.sexy/dist/js/zui.min.js"></script>
  <script type="text/javascript">
    $('form').submit(function() {
      let file = $(":file")[0].files[0];
      let fileName = file.name;
      let fileSize = file.size;
      console.log('fileSize',fileSize);
      let blockSize = 0.9*1024*1024;
      let num = Math.ceil(fileSize/blockSize);
      let start = 0;
      let end = 0;
      for(let i=1;i<=num;i++){
        end = blockSize*i;
        if(end > fileSize){
          end = fileSize;
        }
        let block = file.slice(start,end);
        start = end;
        let fd = new FormData();
        fd.append('block',block);
        fd.append('name',fileName);
        fd.append('total',num);
        fd.append('index',i);
        $.ajax({
          url:"upload.php",
          type:"POST",
          data:fd,
          async:true,
          processData:false,
          contentType:false,
          success:(res)=>{
            console.log('res_'+i+":");
            console.log(res);
          }
        })
      }
      return false;
    });
  </script>
 </body>
</html>

后端代码

在所有的文件上传成功之后,合并生成原来的大文件

<?php
$name = $_POST['name'];
$index = $_POST['index'];
$total = $_POST['total'];
echo "name:".$name.PHP_EOL;
echo "index:".$index.PHP_EOL;
echo "total:".$total.PHP_EOL;
move_uploaded_file($_FILES['block']['tmp_name'],'upload/'.$name."_".$index);
$list = scandir('upload');
$num = count($list)-2;
echo "cur_num:".$num.PHP_EOL;
if($num == $total){
  echo "upload done".PHP_EOL;
  echo $cmd = "cat upload/'{$name}_'* > upload/'{$name}'";
  shell_exec($cmd);
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
在laravel中使用with实现动态添加where条件
Oct 10 PHP
PHP实现简单用户登录界面
Oct 23 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 #PHP
php多进程应用场景实例详解
Jul 22 #PHP
PHP实现的多进程控制demo示例
Jul 22 #PHP
php+lottery.js实现九宫格抽奖功能
Jul 21 #PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 #PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 #PHP
PHP INT类型在内存中占字节详解
Jul 20 #PHP
You might like
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
python读写csv文件实例代码
2019/07/05 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
人力资源专员岗位职责
2014/01/30 职场文书
体育专业自荐书
2014/05/29 职场文书
教师教育心得体会
2016/01/19 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL
mysql数据库如何转移到oracle
2022/12/24 MySQL