腾讯云对象存储,PHP与JS对接版本

来源:互联网 发布:中国买俄罗斯石油知乎 编辑:程序博客网 时间:2024/03/29 18:40

这几天使用了一下腾讯云的COS对象存储服务,发现在使用中遇到了一些问题,在此记录下来,一是做个记录,二是希望以我的经验帮助到其他的人。

1、PHP与JS基本使用指南

在我使用腾讯云的COS对象存储服务时,其已经出了V4版本的了;因此之后的内容都是基于V4版本之上的。PHP与JS的基本使用,个人觉得其GITHUB上的文档基本可以理解了;但是在JS上还是出现了问题。
PHPSDK的地址:https://github.com/tencentyun/cos-php-sdk-v4。
JSSDK的地址:https://github.com/tencentyun/cos-js-sdk-v4。

2、JS上的问题

之前在使用其JSSDK时,一开始想测试其单独使用时是否可以使用,便使用了其给的样例,直接给到其Key进行加密。但是使用其样例中的代码:
(PS:这些问题都是前端小伙伴们遇到的)
var self = this;                    var random = parseInt(Math.random() * Math.pow(2, 32));                    var now = parseInt(new Date().getTime() / 1000);                    var e = now + 60; //签名过期时间为当前+60s                    var path = '';//多次签名这里填空                    var str = 'a=' + self.appid + '&k=' + sid + '&e=' + e + '&t=' + now + '&r=' + random +                            '&f=' + path + '&b=' + self.bucket;                    var sha1Res = CryptoJS.HmacSHA1(str, skey);//这里使用CryptoJS计算sha1值,你也可以用其他开源库或自己实现                    var strWordArray = CryptoJS.enc.Utf8.parse(str);                    var resWordArray = sha1Res.concat(strWordArray);                    var res = resWordArray.toString(CryptoJS.enc.Base64);                    setTimeout(function () {//setTimeout模拟一下网络延迟的情况                        callback(encodeURIComponent(res));                    }, 1000);
但是,这样使用就报错了,记忆中是ERROR_PROXY_APPID_USERID_NOTMATCH错误,感觉很是不可思议,觉得自己已经把自己的appid, key等东西都写死在这个程序里了,怎么会出现这个错误,然后上网搜索,发现有人提到要将self.appid与self.bucket去掉;然后去掉了,果然不报这个错误了,该为另一个错误,变成了签名过期的错误。很是莫名其妙的。然后查了好多时间都没有发现问题在哪里。

3、JS与PHP前后端对接

PHP端的接口我用时还没有发现什么错误,但是当前端小伙伴和我说其JS测试失败了,我就准备使用PHP生成密钥发给JS,然后上传看能不能成功。
V4对应的文档应该是:https://www.qcloud.com/document/product/436。(本人一开始看错文档了)
文档清楚的介绍了签名算法的实现,但是PHPSDK中已经有了实现了。其在中的auth.php,我使用的是:createReusableSignature($expiration, $bucket, $filepath = null)方法,很简单,只要传入三个参数就可以生成签名。
于是可以利用JS中的样例访问你生成签名的接口,获得签名后就可以进行操作了。但是在这里我又失败了,出现了一个莫名的错误:fileId不匹配的问题。然后就很困惑。因为这里都没有让我们填fileId的相关事务。
于是之后我又仔细看了看JS的上传接口:
cos.uploadFile(successCB, errorCB, progressCB, bucket, myFolder + 'test1.zip', file, 1);
发现一个问题,就是在这里填写了一个我们的文件路径了,然后在PHP生成密钥当中是不是就该不填$filepath的值了,于是我就将其$filepath取默认的null。然后就成功了。
0 0