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创建PDF中文文档
Oct 09 PHP
Zend公司全球首推PHP认证
Oct 09 PHP
桌面中心(一)创建数据库
Oct 09 PHP
PHP文件上传原理简单分析
May 29 PHP
php计划任务之ignore_user_abort函数实现方法
Jan 08 PHP
php实现的简单日志写入函数
Mar 31 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
分享PHP函数实现数字与文字分页代码
Jul 28 PHP
利用PHP自动生成印有用户信息的名片
Aug 01 PHP
使用PHP免费发送定时短信的实例
Oct 24 PHP
PHP 无限级分类
May 04 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 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 中的批处理的实现
2007/06/14 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
php获取参数的几种方法总结
2014/02/18 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
jquery attr 设定src中含有&(宏)符号问题的解决方法
2011/07/26 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
numpy.transpose对三维数组的转置方法
2018/04/17 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
python生成requirements.txt的两种方法
2019/09/18 Python
Python实现FLV视频拼接功能
2020/01/21 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
为什么需要版本控制
2016/10/28 面试题
焊接专业毕业生求职信
2013/10/01 职场文书
诚信承诺书范文
2014/03/27 职场文书
勤俭节约倡议书
2014/04/14 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang