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桌面中心(二) 数据库写入
Mar 11 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
如何解决PHP无法实现多线程的问题
Sep 25 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 PHP
Yii框架应用组件用法实例分析
May 15 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开发框架myqee新手快速入门教程
2014/07/14 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
js 动态选中下拉框
2009/11/26 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
javascript自执行函数
2017/02/10 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python中datetime常用时间处理方法
2015/06/15 Python
python实现发送邮件及附件功能
2021/03/02 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
Python 串口读写的实现方法
2019/06/12 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
个人实用的自我评价范文
2013/11/23 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
大学专科求职信
2014/07/02 职场文书
争做文明公民倡议书
2014/08/29 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers