引自免费微信小程序:皆我百晓生
遇到在使用移动云EOS服务端签名上传图片时出现“Policy missing condition: name”的错误,这通常意味着在构建签名策略(policy)时,没有正确地包含所有必需的条件。具体到这个错误,表明policy中缺少了对object名称的限定条件。
解决这个问题的关键在于确保policy中包含了对object name的限制。在computeSignature方法中,通过acl, bucket, key等参数传递的信息,可以构造出符合要求的policy。然而,有时这些信息可能不足以让SDK自动生成一个完整的、满足服务器验证需求的policy。
为了解决这个问题,你可以尝试手动构建policy JSON字符串,并在调用computeSignature方法时,将这个JSON字符串作为参数传入。这样可以确保policy中包含了所有必要的条件,包括object的name。
下面是一个示例代码,展示如何手动构建一个包含object name条件的policy:
import com.alibaba.fastjson.JSON;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
// 假设Signer类和computeSignature方法已经按照移动云的SDK实现
// 这里只展示如何构建policy
public class CustomPolicyBuilder {
public static void main(String[] args) {
String accessKeyId = "your_access_key_id";
String accessKeySecret = "your_access_key_secret";
String bucket = "your_bucket_name";
String key = "path/to/your/object";
int durationSeconds = 3600; // 签名有效期,单位:秒
String contentType = "image/jpeg"; // 上传文件的MIME类型
String acl = "public-read"; // 对象的访问权限
// 构建policy
Map<String, Object> policyMap = new LinkedHashMap<>();
policyMap.put("expiration", new Date(System.currentTimeMillis() + (durationSeconds * 1000)).toGMTString());
policyMap.put("conditions", new Object[]{
{"bucket", bucket},
{"name", key},
{"acl", acl},
{"Content-Type", contentType}
});
String policyJson = JSON.toJSONString(policyMap);
// 使用自定义的policy进行签名
Map<String, String> authorization = signer.computeSignature(durationSeconds, accessKeyId, accessKeySecret, policyJson);
// 接下来使用authorization中的信息进行上传操作
// ...
}
}
在上述代码中,我们首先创建了一个LinkedHashMap来构建policy的JSON结构,其中特别注意了"conditions"部分,确保包含了{"name", key}这一项。然后使用JSON.toJSONString()将这个map转换为JSON格式的字符串,最后将其传递给computeSignature方法进行签名。
通过这种方式,你可以确保policy中包含了所有必要的条件,从而避免“Policy missing condition: name”的错误。记得替换代码中的your_access_key_id, your_access_key_secret, your_bucket_name, path/to/your/object等占位符为你实际使用的值。