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 相关文章推荐
IIS6的PHP最佳配置方法
Mar 19 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
解析php中反射的应用
Jun 18 PHP
php 启动报错如何解决
Jan 17 PHP
php强制运行广告的方法
Dec 01 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
php简单截取字符串代码示例
Oct 19 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 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
mysql 全文搜索 技巧
2007/04/27 PHP
PHP中对用户身份认证实现两种方法
2011/06/04 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
vue中SPA单页面应用程序详解
2017/11/07 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
python实现邮件自动发送
2019/08/10 Python
python多线程使用方法实例详解
2019/12/30 Python
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
财务担保书范文
2014/04/02 职场文书
大学生学习计划书
2014/09/15 职场文书
博士生专家推荐信
2014/09/26 职场文书
干部考察材料范文
2014/12/24 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL