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 相关文章推荐
第八节--访问方式
Nov 16 PHP
php 删除记录实现代码
Mar 12 PHP
php的$_FILES的临时储存文件与回收机制实测过程
Jul 12 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
Aug 12 PHP
PHP入门教程之PHP操作MySQL的方法分析
Sep 11 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
php实现每日签到功能
Nov 29 PHP
PHP中类与对象功能、用法实例解读
Mar 27 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 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
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
vue实例的选项总结
2020/06/09 Javascript
Python中使用PDB库调试程序
2015/04/05 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
如何利用Fabric自动化你的任务
2016/10/20 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
利用Python检测URL状态
2019/07/31 Python
python字典key不能是可以是啥类型
2020/08/04 Python
python如何设置静态变量
2020/09/07 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
xxx同志考察材料
2014/02/07 职场文书
开业主持词
2014/03/21 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python