PHP大文件切割上传功能实例分析


Posted in PHP onJuly 01, 2019

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

大家都知道php上传文件有限制,如果没有修改过php.ini文件的话,默认的上传大小限制为2M,那么该如何上传大文件了,比如说上传一个1G多的大文件,可以使用大文件切割上传的方式来解决。

何为大文件切割上传?

原理:利用HTML5的新特性,将文件内容切割成分段的二进制信息,然后每次向服务器上传一段,而服务器,只需要把我们每次上传的二进制信息整合存储到一个文件中,那么最后这个文件就是所上传的文件。

由于php.ini默认的上传大小为2M,如果每批都上传2M,我测试的时候时间比较长,这里我将其限制大小该为20M,最大post数据为28M,便于测试。如果实际开发中不能修改其参数,则每批上传的数据不能超过最大限制。

post_max_size = 28M
upload_max_filesize = 20M

JavaScript中的File对象

在之前的文章中我们已经使用到了这个Api,File对象中保存了文件的大小、名称、类型等信息

JavaScript中的Blob对象

Blob对象是二进制对象,也是File对象的父类,Blob对象中有一个很重要的方法:slice() 方法,利用这个方法我们可以把文件内容切割成二进制信息。slice() 方法接受三个参数,起始偏移量,结束偏移量,还有可选的 mime 类型。如果 mime 类型,没有设置,那么新的 Blob 对象的 mime 类型和父级一样。

案例:

项目结构图:

PHP大文件切割上传功能实例分析

13-slice-upload.html文件:

页面中主要有一个上传控件,确认文件后响应selfile方法,然后读取文件信息,设置每批上传文件限制为10M,接着在while循环中,不断的切割文件,然后发送上传请求。

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <title>大文件切割上传</title>
 <link rel="stylesheet" href="">
<script>
 function selfile(){
  const LENGTH = 1024 * 1024 * 10;//每次上传的大小
  var file = document.getElementsByName('video')[0].files[0];//文件对象
  var totalSize = file.size;//文件总大小
  var start = 0;//每次上传的开始字节
  var end = start + LENGTH;//每次上传的结尾字节
  var fd = null//创建表单数据对象
  var blob = null;//二进制对象
  var xhr = null;//xhr对象
  while(start < totalSize){
   fd = new FormData();//每一次需要重新创建
   xhr = new XMLHttpRequest();//需要每次创建并设置参数
   xhr.open('POST','13-slice-upload.php',false);
   blob = file.slice(start,end);//根据长度截取每次需要上传的数据
   fd.append('video',blob);//添加数据到fd对象中
   xhr.send(fd);//将fd数据上传
   //重新设置开始和结尾
   start = end;
   end = start + LENGTH;
  }
 }
</script>
</head>
<body>
 <h1>大文件切割上传</h1>
 <input type="file" name="video" onchange="selfile();" />
</body>
</html>

13-slice-upload.php文件:

如果第一次上传时,文件不存在,就创建文件,此后上传只需要把数据追加到此文件中。

<?php
/**
 * 大文件切割上传,把每次上传的数据合并成一个文件
 * @author webbc
 */
$filename = './upload/upload.wmv';//确定上传的文件名
//第一次上传时没有文件,就创建文件,此后上传只需要把数据追加到此文件中
if(!file_exists($filename)){
 move_uploaded_file($_FILES['video']['tmp_name'],$filename);
}else{
 file_put_contents($filename,file_get_contents($_FILES['video']['tmp_name']),FILE_APPEND);
}
?>

运行结果图:

PHP大文件切割上传功能实例分析

解释:

此处我上传了一个46.8M的视频文件,如果按每批发送10M的话,共需发送5次,也就是说会请求服务器5次。如下图所示。

PHP大文件切割上传功能实例分析

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

PHP 相关文章推荐
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
php通用防注入程序 推荐
Feb 26 PHP
ThinkPHP写第一个模块应用
Feb 20 PHP
PHP可变函数的使用详解
Jun 14 PHP
php中通过数组进行高效随机抽取指定条记录的算法
Sep 09 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
php浏览历史记录的方法
Mar 10 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
基于PHP实现发微博动态代码实例
Dec 11 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 #PHP
PHP封装cURL工具类与应用示例
Jul 01 #PHP
PHP session垃圾回收机制实例分析
Jun 28 #PHP
PHP常用的类封装小结【4个工具类】
Jun 28 #PHP
php实现网页上一页下一页翻页过程详解
Jun 28 #PHP
php输出控制函数和输出函数生成静态页面
Jun 27 #PHP
php生成静态页面并实现预览功能
Jun 27 #PHP
You might like
Smarty模板快速入门
2007/01/04 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php中session与cookie的比较
2015/01/27 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
python类定义的讲解
2013/11/01 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
python的等深分箱实例
2019/11/22 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
社区服务活动总结
2014/05/07 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
护理工作个人总结
2015/03/03 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
MySQL的安装与配置详细教程
2021/06/26 MySQL
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android