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 相关文章推荐
Smarty模板快速入门
Jan 04 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
Jun 01 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
PHP+MySQL修改记录的方法
Jan 21 PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 PHP
php 如何获取文件的后缀名
Jun 05 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHP实现的策略模式简单示例
Aug 25 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
php之CodeIgniter学习笔记
2013/06/17 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
python开发中module模块用法实例分析
2015/11/12 Python
图文详解WinPE下安装Python
2016/05/17 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
安装docker-compose的两种最简方法
2019/07/30 Python
numpy库reshape用法详解
2020/04/19 Python
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
二年级小学生评语
2014/04/21 职场文书
高中生学习计划书
2014/09/15 职场文书
学生打架检讨书
2014/10/20 职场文书
校本培训个人总结
2015/02/28 职场文书
2016春节慰问信范文
2015/03/25 职场文书
大学生受助感言
2015/08/01 职场文书