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
PHP学习资料汇总与网址
Mar 16 PHP
php 采集书并合成txt格式的实现代码
Mar 01 PHP
使用php来实现网络服务
Sep 15 PHP
PHP 第二节 数据类型之字符串类型
Apr 28 PHP
如何使用Strace调试工具
Jun 03 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP实现上传文件并存进数据库的方法
Jul 16 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
PHP文件后缀不强制为.php方法
Mar 31 PHP
php依赖注入知识点详解
Sep 23 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
Js 中debug方式
2010/02/07 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
python re正则表达式模块(Regular Expression)
2014/07/16 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
如何写一个自定义标签
2012/12/28 面试题
总裁办公室主任职责
2014/01/02 职场文书
积极分子思想汇报
2014/01/04 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
党员批评与自我批评
2014/10/15 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
离婚协议书怎么写
2015/01/26 职场文书
钱学森电影观后感
2015/06/04 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技