PHP大文件分片上传的实现方法


Posted in PHP onOctober 28, 2018

一、前言

在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传。

分片上传主要是前端将一个较大的文件分成等分的几片,标识当前分片是第几片和总共几片,待所有的分片均上传成功的时候,在后台进行合成文件即可。

二、开发过程中遇到的问题

  1. 分片的时候每片该分多大size?太大会出现“413 request entity too large”
  2. 分片上传的时候并不是严格按照分片的序号顺序上传,如何判断所有的分片均上传成功?
  3. 合成文件的时候如何判断保证合成一个完整的文件而不出错?多个分片同时上传的时候,读写文件没有独占锁的时候会导致合成错误。

三、问题解决

当出现413的时候,修改了 nginx.conf 和php.ini

(1)nginx中添加client_max_body_size和client_body_buffer_size

PHP大文件分片上传的实现方法

(2)php.ini添加post_max_size 和 upload_max_filesize

重启nginx和php-fpm

代码逻辑梳理和分享

    (1)先获取当前分片是第几片以及总共几片

    (2)创建一个文件夹用来存储所有的分片以及合成的文件

 PHP大文件分片上传的实现方法

   (3)变量$done初始为true,用来判断是否所有的分片都上传完成,每个分片保存的时候使用分片序号作为文件名,然后判断所有的分片文件是否存在

PHP大文件分片上传的实现方法

    (4)当$done===true的时候,代表所有分片上传完成,合成文件。     

PHP大文件分片上传的实现方法

       $target变量代表合成后的文件名,file_exists判断是否已经合成成功,然后追加方式创建打开文件,循环将每个分片内容写入一个文件中。

       在读取每个分片之前先判断当前分片是否存在,是为了防止多个进程执行合成文件代码块的时候导致某个分片已经写入删除,最后导致合成的文件是不完整的,此时需要删除合成的不完整的文件并退出exit当前进程。

       其中每个分片最好设置独占锁,flock($in, LOCK_EX),用来保证读写分片的时候其他进程不会操作该分片。最后删除分片unlink以及释放独占锁。

总结

以上所述是小编给大家介绍的PHP大文件分片上传的实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

PHP 相关文章推荐
PHP+AJAX实现无刷新注册(带用户名实时检测)
Jan 02 PHP
php中实现记住密码自动登录的代码
Mar 02 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 PHP
服务器迁移php版本不同可能诱发的问题
Dec 22 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
May 28 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
php微信开发之图片回复功能
Jun 14 PHP
php+ajax 文件上传代码实例
Mar 18 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 PHP
PHP array_reduce()函数的应用解析
Oct 28 #PHP
php 中phar包的使用教程详解
Oct 26 #PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 #PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 #PHP
实例解析php的数据类型
Oct 24 #PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
Oct 23 #PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 #PHP
You might like
第1次亲密接触PHP5(1)
2006/10/09 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
extjs render 用法介绍
2013/09/11 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
Python入门教程之运算符与控制流
2016/08/17 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
Django values()和value_list()的使用
2020/03/31 Python
西雅图的买手店:Totokaelo
2019/10/19 全球购物
电气专业应届生求职信
2013/11/01 职场文书
小学新学期教师寄语
2014/01/18 职场文书
基督教婚礼主持词
2014/03/14 职场文书
商场消防安全责任书
2014/07/29 职场文书
给老婆的检讨书
2015/01/27 职场文书
「月刊Action」2022年5月号封面公开
2022/03/21 日漫