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 相关文章推荐
Php部分常见问题总结
Oct 09 PHP
基于文本的访客签到簿
Oct 09 PHP
WML,Apache,和 PHP 的介绍
Oct 09 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
Feb 02 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
YII实现分页的方法
Jul 09 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
详解Laravel框架的依赖注入功能
May 27 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
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
php接口隔离原则实例分析
2019/11/11 PHP
JavaScript 继承详解(一)
2009/07/13 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python paramiko模块学习分享
2017/08/23 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
Python实现代码统计工具
2019/09/19 Python
pymysql的简单封装代码实例
2020/01/08 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
集体婚礼证婚词
2014/01/13 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
社会工作专业求职信
2014/07/15 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android
Python实现简单得递归下降Parser
2022/05/02 Python