scope:<bucket>:<key>的覆盖模式能用吗,我这里什么一直报badtoken

token生成代码如下
PutPolicy putPolicy = new PutPolicy("mymiyoustore:avatar.png");
putPolicy.expires = 60;
putPolicy.fsizeLimit=640000;
putPolicy.callbackBody="userId=" + userId + "&url=http://$(bucket).qiniudn.com/$(key)";
//putPolicy.saveKey=userId + "_avatar";
putPolicy.callbackUrl= ConfigInit.callBackRoot + "/upload/callback/avatar";
String upToken = null;

    try
    {
        upToken = putPolicy.token(mac);

使用token上传代码如下

String key = null;
String localFString = "test1.jpg";
PutRet ret = IoApi.putFile(upToken, key, localFString, extra);
System.out.println(ret);

错误信息如下
{"error":"bad token"}

有没有兄弟遇到同样问题的,求指点!

阅读 4.6k
2 个回答

问题在使用token上传这部分代码
String key = null;
String localFString = "test1.jpg";
PutRet ret = IoApi.putFile(upToken, key, localFString, extra);
System.out.println(ret);

把 key = null 改成实际的 key 值之后问题就解决了。

这个看来是七牛服务端规定了putPolicy中如果是scope:“bucket:key”样式的话,不允许IoApi.putFile函数的key参数为null。问题就到这里就算完了,那作为客户端如果要覆盖key上传的话,必须指明这个key了。
但是,本来在生成的token里面都已经说明了key是多少了,上传的时候再指明一次key值,是不是多余了?文档里也不说明,坑某人一下午,好辛苦!!

经测试,楼上的方法可行,scope里的key就是文件名,文件覆盖的话,需要在上传时指定key,与scope的key值一样。