-
PHP大文件分块上传功能实例详解
本文实例讲述了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);
- }
出处:http://www.phpfensi.com/php/20211207/18968.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式