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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
PHP 数组遍历方法大全(foreach,list,each)
Jun 30 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
php网站被挂木马后的修复方法总结
Nov 06 PHP
全新Mac配置PHP开发环境教程
Feb 03 PHP
PHP动态生成指定大小随机图片的方法
Mar 25 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 09 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 翻页 实例代码
2009/08/07 PHP
php启动时候提示PHP startup的解决方法
2013/05/07 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
img标签中onerror用法
2009/08/13 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
jquery 笔记 事件
2011/11/02 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
python操作列表的函数使用代码详解
2017/12/28 Python
python的pip安装以及使用教程
2018/09/18 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
高中学生评语大全
2014/04/25 职场文书
分公司经理任命书
2014/06/05 职场文书
民间个人借款协议书
2014/09/30 职场文书
技术入股合作协议书
2014/10/07 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript