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 相关文章推荐
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
通俗易懂的php防注入代码
Apr 07 PHP
PHP求小于1000的所有水仙花数的代码
Jan 10 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
php中fgetcsv()函数用法实例
Nov 28 PHP
php利用cookies实现购物车的方法
Dec 10 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
JavaScript的Function详细
2006/11/14 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
python 字符串split的用法分享
2013/03/23 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
Python 专题四 文件基础知识
2017/03/20 Python
python分析作业提交情况
2017/11/22 Python
Python中装饰器学习总结
2018/02/10 Python
python中pip的安装与使用教程
2018/08/10 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
pybind11在Windows下的使用教程
2019/07/04 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
详解Python中的分支和循环结构
2020/02/11 Python
python异步Web框架sanic的实现
2020/04/27 Python
python3字符串输出常见面试题总结
2020/12/01 Python
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
运动会横幅标语
2014/06/17 职场文书
西柏坡导游词
2015/02/05 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
巴黎圣母院观后感
2015/06/10 职场文书