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&&mysql)三
Oct 09 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 PHP
PHP常用的文件操作函数经典收藏
Apr 02 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
php while循环得到循环次数
Oct 26 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
Yii中Model(模型)的创建及使用方法
Dec 28 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
yii2 页面底部加载css和js的技巧
Apr 21 PHP
php插件Xajax使用方法详解
Aug 31 PHP
Ubuntu上安装yaf扩展的方法
Jan 29 PHP
关于ThinkPHP中的异常处理详解
May 11 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
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
python多重继承实例
2014/10/11 Python
python自动格式化json文件的方法
2015/03/11 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
详解非极大值抑制算法之Python实现
2021/06/28 Python
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android
redis protocol通信协议及使用详解
2022/07/15 Redis