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简单静态页生成过程
Mar 27 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Nov 23 PHP
JavaScript实现滚动栏效果的方法
Apr 27 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 PHP
PHP输入输出流学习笔记
May 12 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 PHP
Yii框架 session 数据库存储操作方法示例
Nov 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
Php header()函数语法及使用代码
2013/11/04 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
vue实现计算器功能
2020/02/22 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python Numpy库datetime类型的处理详解
2019/07/13 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
Python二元赋值实用技巧解析
2019/10/25 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
《散步》教学反思
2014/03/02 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书