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 相关文章推荐
一个SQL管理员的web接口
Oct 09 PHP
生成php程序的php代码
Apr 07 PHP
通用PHP动态生成静态HTML网页的代码
Mar 04 PHP
PHP 显示客户端IP与服务器IP的代码
Oct 12 PHP
PHP输出时间差函数代码
Jan 28 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
Mar 12 PHP
PHP动态柱状图实现方法
Mar 30 PHP
php删除指定目录的方法
Apr 03 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
PHP 第三节 变量介绍
2012/04/28 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
js实现内置计时器
2019/12/16 Javascript
使用python实现扫描端口示例
2014/03/29 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python自动发邮件脚本
2017/03/31 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
比利时买床:Beter Bed
2017/12/06 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
校三好学生主要事迹
2014/01/11 职场文书
兽医医药专业求职信
2014/07/27 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers