最近公司项目需要完成一个微课上传的需求 最开始是通过腾讯云简单上传对象操作 直接上传(公司资源都是保存在腾讯云)。这个基本上传个50M左右没什么问题,但是由于PHP的最大请求时间限制 加上产品要求做一个真实进度条这时候犯难了 毕竟之前没做过(以前都是拿前端插件做的假进度条)。经过多方百度 最后确定了 分片上传的思路 接下来给大家分享下 我做这个分片上传的步骤
首先前面说了我们资源是保存在腾讯云的所以调用上传的接口其实就是腾讯云的存储桶!
说分片上传 那我们就要说一下什么是分片,其实一开始我也不是很明白 其实现在我也不知道理解的对不对 只是说一下我的理解 还望指正!
简单的说比如你是100M视频 那么为了避免上传请求超时 那么我们就要把他切割成一些小文件 你可以分成10块每块10M 、20块每块5M,自己去定义 那么正常情况下 你传5M的视频是不会超时的 不仅解决了超时的问题 还能够实现真实进度条的显示 5% 10% 这样去递增 话不多说 我们直接来说说实现方式
1.前端切片
首先要明白 将100M分成 10个或者20个小文件 这个过程是在前端完成的 前端切割上传到后台最后合并 这一点在腾讯的接口上也是体现出来了 后面会说到!文件切割的代码我就不贴了 自己去百度很多我这里主要是记录一下思路
2.初始化上传
分块上传对象: 初始化分块上传, 上传分块, 完成分块上传。
这是腾讯云给出的步骤 大概就是首先你需要建立一个唯一的上传过程,初始化之后会返回一个上传ID给你 这个id在后面很多地方都需要用到 这一步需要两个参数 一个是你的存储桶标识 另外一个实际上你可以理解为你上传之后你在桶里的存放位置xx/xxx/xxx.MP4
3.上传分块
这一步除了前面说的几个基础参数以外多了 Body、PartNumber
Body 实际上就是文件信息 fopen($file->getRealPath(), 'rb') --- 这里我被困扰了很久
PartNumber 这个实际上就是切片的编号 10片 那就是1-10 依次递增(顺序不能乱)
4.完成上传
Parts 将你每次上传的块以array的形式传参 ETag每个分块的MD5值 另外一个就是我们前面说的分块编号
完成上传之后 官方文档好像没看到返回参数的说明(也许是我没找到)
返回里面ETag 这个参数为文件的md5值 这个值可以和文件地址一起存起来 这样下次上传同样MD5值文件的时候 我们就不必走这么多流程了 直接返回已有地址即可
好了 以上就是我做这个分片的过程!
既是分享,也是温习。互相学习,多谢指正。
网友评论