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截断标题且兼容utf8和gb2312编码
Sep 22 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
PHP采集静态页面并把页面css,img,js保存的方法
Dec 23 PHP
php实现的微信红包算法分析(非官方)
Sep 25 PHP
php短信接口代码
May 13 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
PHP面向对象中new self()与 new static()的区别浅析
Aug 17 PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 PHP
PHP多维数组指定多字段排序的示例代码
May 16 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
php 缓存函数代码
2008/08/27 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
js 巧妙去除数组中的重复项
2010/01/25 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
小程序自定义日历效果
2018/12/29 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
python合并多个excel文件的示例
2020/09/23 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
八项规定整改措施
2014/02/12 职场文书
村委会换届选举方案
2014/05/03 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
2014年转正工作总结
2014/11/08 职场文书
六年级学生期末评语
2014/12/26 职场文书
晚会开幕词
2015/01/28 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书