Closed CoXier closed 6 years ago
我感觉我解释的有点不太清楚,举个例子。
我在 server 上可以生成 uptoken, 程序:
q = Auth(access_key, secret_key)
# 要上传的空间
bucket_name = 'xxx'
# 上传到七牛后保存的文件名
key = ''
# 生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name, key, 3600)
这里的 key 是 ''
但是我在小程序中,如果我没有指定 key 的话,也就是使用微信的 tmp 文件名。就会出现 error。因为这两个 key 是不一样的。
似乎不会这样,因为你生成 token 的时候,并不能确定你要上传的文件名是什么。
你可以看到,在 sdk 内部请求token 的时候,也是在获取 key 之前的
function getQiniuToken(callback) {
wx.request({
url: config.qiniuUploadTokenURL,
success: function (res) {
var token = res.data.data.token;//res.data.uptoken;
if (token && token.length > 0) {
config.qiniuUploadToken = token;
if (callback) {
callback();
}
} else {
console.error('qiniuUploader cannot get your token, please check the uptokenURL or server')
}
},
fail: function (error) {
console.error('qiniu UploadToken is null, please check the init config or networking: ' + error);
}
})
}
但是的确会出现这个问题:{"error":"key doesn't match with scope"}
如果我显式写了 uptoken 的值,sdk 内部还会 getQiniuToken
吗?
经过测试,如果在生成 uptoken 时传入的 Key 不一样,那么生成的 token 也会不一样。
不会,token 检查逻辑如下
我猜测 token 可能没办法在微信小程序写死,在每次上传前都需要指定 Key 然后生成 token,再上传文件。
我的 app 里是只在 app 第一次调用的时候请求一次 token,后面就一直用了,你试试生成 token 的时候不要带 key,或者看看文档? 不好意思,我现在没有足够的时间看生成 token 的文档。
请问你第一层生成 token 时指定了 key 的吗?
并没有呀,我的 upTokenUrl 是 https://api.xxx.com/qiniu/token
,其他的就交给 sdk 内部处理了
请问你是指官方有可以生成 token 的接口吗?
https://api.xxx.com/qiniu/token 是官方的吗?
问题解决了,果然是因为 key 的问题。
如果之后还有人遇到类似的问题,请注意server端不能指定 key。
多谢提醒,下次如果有人遇到我会及时提醒
你好,很感谢做出这么棒的库。
目前我遇到一个关于 uptoken 的问题。从 README 我了解到,我似乎是可以写死 token 的。但是上传文件的时候,如果指定的 key 和生成 uptoken 的 key 不一样时,上传就会失败。