in solution/solution-oss-pre-signed/code-example/java/spring-boot/src/main/java/org/example/service/UploadService.java [54:129]
public PostSignatureResp generatePostSignature() {
try {
long expireEndTime = System.currentTimeMillis() + ossConfig.getUploadExpireTime() * 1000;
Date expiration = new Date(expireEndTime);
// 构造 OSS Policy
// 更多 Policy,请参考:https://help.aliyun.com/zh/oss/developer-reference/signature-version-4-recommend#49c0713824yc9
PolicyConditions policyConds = new PolicyConditions();
// 限制上传文件的大小
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
// 限制 OSS Object 名称。这里通过 starts-with 指定前缀,限制上传文件所在的目录
// 本示例,未区分调用者身份,允许调用用户上传文件到同一个固定的 OSS 文件夹下
// 您可以根据调用者身份,使用调用者的登录信息等唯一标识作为 OSS 文件夹名称,保证不同调用者和不同文件夹绑定并且只允许上传文件到与其绑定的文件夹下,以此隔离调用用户的资源和权限
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossConfig.getDir());
String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);
// 构造 OSS Callback 配置
// 客户端上传完后,OSS 会根据 Callback 配置,将上传后的文件信息回调给服务端
// 如果您的业务场景不需要感知客户端上传结果,可以忽略此段回调配置的代码
OssPostCallback ossPostCallback = OssPostCallback.builder()
.callbackUrl(ossConfig.getPostCallbackUrl())
// callbackBody 支持 OSS 系统参数、自定义变量和常量
// 更多参数配置,请参考:https://help.aliyun.com/zh/oss/developer-reference/callback#a8a8e930e31fv
.callbackBody(
"filename=${object}"
+ "&size=${size}"
+ "&mimeType=${mimeType}"
+ "&height=${imageInfo.height}"
+ "&width=${imageInfo.width}"
)
.callbackBodyType("application/x-www-form-urlencoded")
.build();
String base64PostCallback = BinaryUtil.toBase64String(JSON.toJSONString(ossPostCallback).getBytes());
PostSignatureResp postSignatureResp = PostSignatureResp.builder()
.accessKeyId(ossCredentialsProvider.getCredentials().getAccessKeyId())
.securityToken(ossCredentialsProvider.getCredentials().getSecurityToken())
.policy(encodedPolicy)
.signature(postSignature)
.dir(ossConfig.getDir())
.host(ossConfig.getHost())
.expires(String.valueOf(expireEndTime / 1000))
.callback(base64PostCallback)
.build();
return postSignatureResp;
} catch (OSSException e) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
e.printStackTrace();
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
// 打印错误码
System.out.println(e.getErrorCode());
// 打印错误信息
System.out.println(e.getMessage());
// 打印 RequestId
System.out.println(e.getRequestId());
throw e;
} catch (ClientException e) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
e.printStackTrace();
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println(e.getMessage());
throw e;
} catch (Exception e) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
e.printStackTrace();
throw new RuntimeException(e);
}
}