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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
Jun 30 PHP
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
php导出word文档与excel电子表格的简单示例代码
Mar 08 PHP
一组PHP加密解密函数分享
Jun 05 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
php操作access数据库的方法详解
Feb 22 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
PHP重载基础知识回顾
Sep 10 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生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
玩转方法:call和apply
2014/05/08 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
HTML的select控件美化
2017/03/27 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
详解vue组件基础
2018/05/04 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
python将ip地址转换成整数的方法
2015/03/17 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
北承题目(C++)
2012/05/16 面试题
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
城市创卫标语
2014/06/17 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
公司开业主持词
2015/07/02 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
使用Ajax实现无刷新上传文件
2022/04/12 Javascript