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中的 == 运算符进行字符串比较
Nov 26 PHP
php多文件上传下载示例分享
Feb 20 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
php生成QRcode实例
Sep 22 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
PHP实现图片上传并压缩
Dec 22 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
Jan 18 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
PHP中串行化用法示例
Nov 16 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
Jun 05 PHP
50个优秀经典PHP算法大集合 附源码
Aug 26 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
一个程序下载的管理程序(三)
2006/10/09 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
初学JavaScript第二章
2008/09/30 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
浅谈Python的垃圾回收机制
2016/12/17 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
python操作gitlab API过程解析
2019/12/27 Python
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
大学生个人先进事迹材料范文
2014/05/03 职场文书
投资建议书模板
2014/05/12 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
文案策划岗位职责
2015/02/11 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
MySQL普通表如何转换成分区表
2022/05/30 MySQL
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技