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 相关文章推荐
MySQL修改密码方法总结
Mar 25 PHP
Zend framework处理一个http请求的流程分析
Feb 08 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
PHP 小心urldecode引发的SQL注入漏洞
Oct 27 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
Sep 10 PHP
php使用递归函数实现数字累加的方法
Mar 16 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP编程实现的TCP服务端和客户端功能示例
Apr 13 PHP
PHP用swoole+websocket和redis实现web一对一聊天
Nov 05 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
长波知识介绍
2021/03/01 无线电
PHP 第二节 数据类型之数值型
2012/04/28 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
PHP 裁剪图片
2021/03/09 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
Python赋值语句后逗号的作用分析
2015/06/08 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
学习Django知识点分享
2019/09/11 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
土木工程应届生自荐信
2013/09/24 职场文书
中年人生感言
2014/02/04 职场文书
小学家长学校培训材料
2014/08/24 职场文书
竞聘自述材料
2014/08/25 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
详解Spring事件发布与监听机制
2021/06/30 Java/Android
python基础之文件操作
2021/10/24 Python
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL