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 相关文章推荐
留言板翻页的实现详解
Oct 09 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
PHP之数组学习
May 29 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
php+ajax无刷新分页实例详解
Dec 07 PHP
php编译安装php-amq扩展简明教程
Jun 25 PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 PHP
PHP explode()函数用法讲解
Feb 15 PHP
PHP针对redis常用操作实例详解
Aug 17 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 cookie名使用点号(句号)会被转换
2014/10/23 PHP
js 文本滚动效果的实例代码
2013/08/17 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
Python标准库os.path包、glob包使用实例
2014/11/25 Python
python实现将内容分行输出
2015/11/05 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
社区学雷锋活动策划方案
2014/01/30 职场文书
旷课检讨书3000字
2014/02/04 职场文书
超市创业计划书
2014/04/24 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
语文复习计划
2015/01/19 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
董存瑞观后感
2015/06/11 职场文书