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数据库连接类~~做成一个分页类!
Nov 25 PHP
PHP ajax 分页类代码
Nov 13 PHP
php echo()和print()、require()和include()函数区别说明
Mar 27 PHP
PHP无敌近乎加密方式!
Jul 17 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
May 29 PHP
PHP使用数组实现队列
Feb 05 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
php中adodbzip类实例
Dec 08 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
php实例化对象的实例方法
Nov 17 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
php 获取当前访问的url文件名的方法小结
2010/02/08 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python中property属性实例解析
2018/02/10 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
师范大学音乐表演专业求职信
2013/10/23 职场文书
证婚人经典证婚词
2014/01/09 职场文书
搞笑获奖感言
2014/01/30 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
质检员岗位职责范本
2015/04/07 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
银行培训心得体会范文
2016/01/09 职场文书
Python中的变量与常量
2021/11/11 Python