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 作用域解析运算符(::)
Jul 27 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
ThinkPHP 5.1 跨域配置方法
Oct 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
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
试用php中oci8扩展
2015/06/18 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
flexigrid 参数说明
2010/11/23 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
vue注册组件的几种方式总结
2018/03/08 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
python检测远程udp端口是否打开的方法
2015/03/14 Python
Python编写一个优美的下载器
2018/04/15 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Python3多线程基础知识点
2019/02/19 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
班组长工作职责
2013/12/25 职场文书
给客户的道歉信
2014/01/13 职场文书
倡议书格式
2014/04/14 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
员工加薪申请报告
2015/05/15 职场文书
交通事故被告答辩状
2015/05/22 职场文书
python 实现德洛内三角剖分的操作
2021/04/22 Python
MySQL Server层四个日志的实现
2022/03/31 MySQL