最近在做一个微信小程序的项目,其中一块功能就是用户可以在c端自主发布内容,比如一些文字,可以配上图片或者视频,中间碰到几个比较棘手的问题,在这里记录下。
首先我们上传视频是用的视频点播功能,然后图片是OSS,都是前端直传,不过视频上传时,先通过后台接口获取到STSToken,才能通过SDK上传,官方文档都有对应的微信小程序版SDK,按照说明操作即可。
问题一 上传视频分类问题
背景
由于项目的历史原因,包括app,手动上传的静态文件,都是揉合在一起的,几万条数据,想要找到自己上传的这些文件极为困难。
方案
首先想到的是更换目录,但是更换目录就要更换域名,如果后续有业务交集的时候又需要很多额外的操作,比如不同资源需要使用不同的域名。
后来运维同学提供一个思路可以使用分类来区分,如下图:
一想,这个简单,找到官方文档,搜索分类,找到了 CateId 这个字段:
我当时很高兴啊!直接就找到代码,userData里增加一个CateId: 10xxxx,等我去上传的时候傻眼了,视频点播控制台该分类下空空如也。当时从几个方面去思考到底问题出在哪儿:
-
首先就是怀疑CateId有问题
又翻了几遍文档和google结果,发现就是自己用的那个,死心了。
-
查看上传接口的传参 第二个点就是怀疑自己这样加到userData里,上传的时候是不是真的把我的CateId塞到了参数里,没找到,就感觉这里面出现了猫腻。
-
SDK可能有问题 找到项目中用到的SDK,是最新的1.0.1版本,然后搜索CateId, 依次在
setSTSTokenaddFileonUploadstartedonUploadSucceed打断点去调试,发现在setSTSToken方法设置参数的的时候,是从onUploadstarted的回调参数里取的。
key: "setSTSToken",
value: function(e, t, r, i) {
if (!t || !r || !i)
return console.log("accessKeyId、ccessKeySecret、securityToken should not be empty."), !1;
(this._ut = "vod"), (this._uploadWay = "sts");
/// keypoint ////
var n = e,
o = {
accessKeyId: t,
securityToken: i,
accessKeySecret: r,
fileName: e.url,
title: e.url,
requestId: e.ri,
region: this.options.region,
};
n.ImageType && (o.imageType = n.ImageType),
n.ImageExt && (o.imageExt = n.ImageExt),
n.FileSize && (o.fileSize = n.FileSize),
n.Description && (o.description = n.Description),
/// keypoint ////
n.videoInfo.CateId && (o.cateId = n.videoInfo.CateId),
n.Tags && (o.tags = n.Tags),
n.videoInfo.TemplateGroupId && (o.templateGroupId = n.videoInfo.TemplateGroupId),
n.StorageLocation && (o.storageLocation = n.StorageLocation),
n.CoverURL && (o.coverUrl = n.CoverURL),
n.TransCodeMode && (o.transCodeMode = n.TransCodeMode),
n.UserData && (o.userData = n.UserData);
到这里就差不多了,上面标记/// keypoint ////的地方就是我修改的地方,从回调参数e获取改为直接从n.videoInfo里获取,就大功告成。
其他
另外上传oss的时候碰到一个报错<Code>InvalidObjectName</Code>,这个是因为我们上传时,通过wx.uploadFile上传的formData.key不能以/开头,去掉就好了。
to be continued...