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数组
Oct 09 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
smarty实现多级分类的方法
Dec 05 PHP
php编写的一个E-mail验证类
Mar 25 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
Mar 17 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
May 21 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
PHP数组实际占用内存大小原理解析
Dec 11 PHP
一文搞懂php的垃圾回收机制
Jun 18 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导入Excel到MySQL的方法
2011/04/23 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
Vue 中mixin 的用法详解
2018/04/23 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python 调用Java实例详解
2017/06/02 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
365 Tickets英国:全球景点门票
2019/07/06 全球购物
SQL中where和having的区别
2012/06/17 面试题
厨房管理计划书
2014/04/27 职场文书
元旦趣味活动方案
2014/08/22 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
学校工会工作总结2015
2015/05/19 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers