后台生成签名,返回给前台,用于上传文件。
后台源码:
/**
* 腾讯云上传图片签名
* 获取多次签名, 一段时间内有效, 针对上传文件,重命名文件, 创建目录, 获取文件目录属性, 拉取目录列表
*
* @return
*/
@RequestMapping(value = "", method = RequestMethod.POST)
public String getTxyPeriodEffectiveSign(HttpServletRequest request) {
// 需要签名的路径
String cosPath = request.getParameter("cosPath");
// 用户的身份信息, 包括appid, secret_id和secret_key
Credentials cred = new Credentials(TXYun.APPID, TXYun.SECRETID, TXYun.SECRETKEY);
try {
// 签名过期时间
Long expired = System.currentTimeMillis()/1000 + 180;
// 调用腾讯云对象存储的SDK
String sign = Sign.getPeriodEffectiveSign(TXYun.BUCKET, cosPath, cred, expired);
return JacksonUtil.toBizJson("0", "签名成功", sign);
} catch (AbstractCosException e) {
e.printStackTrace();
return JacksonUtil.toBizJson("0", "签名失败", null);
}
}
前台使用签名,调用上传文件接口时报错,错误代码:-63 ERROR_PROXY_FILEID_NOTMATCH fileid与签名不匹配。
失败原因是被腾讯的JSSDK给误导了(也可能是我们理解错了)
下面是腾讯云对象存储的部分JSSDK(demo)源码:
//2.直接在浏览器前端计算签名,需要获取自己的accessKey和secretKey, 一般在调试阶段使用
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(res);
}, 1000);
上面有一句代码:var path = '';//多次签名这里填空
当时前端调用我签名接口的时候,是没有上传这个path参数的,因为sdk里说可以为空。
前端是这么解决的。调签名接口时,传了cosPath = "/"。
这时候返回的签名是正确的,文件能正常上传。
腾讯云对象存储官方文档:https://cloud.tencent.com/document/api/436/7751