From fe09dbf0e271de5f5ea12592c97e9b2442fab593 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Tue, 12 Aug 2025 00:52:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E4=B8=BAjson=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/service/impl/OssServiceImpl.java | 57 ++++++++++++------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/sczx/store/service/impl/OssServiceImpl.java b/src/main/java/com/sczx/store/service/impl/OssServiceImpl.java index 94daf5c..3b76540 100644 --- a/src/main/java/com/sczx/store/service/impl/OssServiceImpl.java +++ b/src/main/java/com/sczx/store/service/impl/OssServiceImpl.java @@ -1,5 +1,6 @@ package com.sczx.store.service.impl; +import com.alibaba.fastjson.JSON; import com.sczx.store.config.OSSConfig; import com.sczx.store.dto.OssPlicyReq; import com.sczx.store.dto.OssPolicyRes; @@ -13,10 +14,7 @@ import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.Base64; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; @Slf4j @Service @@ -29,20 +27,11 @@ public class OssServiceImpl implements OssService { public OssPolicyRes getPolicy(OssPlicyReq ossPlicyReq) { long expireEndTime = System.currentTimeMillis() + ossPlicyReq.getExpireTime() * 1000; - Date expiration = new Date(expireEndTime); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - String expire = df.format(expiration); + Map policyMap = getStringObjectMap(ossPlicyReq, expireEndTime); - // 创建policy - Map policyMap = new LinkedHashMap<>(); - policyMap.put("expiration", expire); - - Map conditionMap = new LinkedHashMap<>(); - conditionMap.put("bucket", ossPlicyReq.getBucketName()); // 需要替换成你的 bucket 名称 - - policyMap.put("conditions", new Object[]{conditionMap}); - - String policy = Base64.getEncoder().encodeToString(policyMap.toString().getBytes(StandardCharsets.UTF_8)); + // 使用FastJSON序列化policy为标准JSON字符串 + String policyJson = JSON.toJSONString(policyMap); + String policy = Base64.getEncoder().encodeToString(policyJson.getBytes(StandardCharsets.UTF_8)); String signature = calculateSignature(ossConfig.getAccessKeySecret(), policy); // 构造返回数据 @@ -50,12 +39,42 @@ public class OssServiceImpl implements OssService { response.setAccessid(ossConfig.getAccessKeyId()); response.setPolicy(policy); response.setSignature(signature); - response.setDir(ossPlicyReq.getDir()+"/"); // 可以自定义上传目录 - response.setHost("https://" + ossPlicyReq.getBucketName() + "." + ossConfig.getRegion() + ".aliyuncs.com"); // 需要替换成你的 bucket 名称 + response.setDir(ossPlicyReq.getDir() + "/"); // 可以自定义上传目录 + response.setHost("https://" + ossPlicyReq.getBucketName() + "." + ossConfig.getRegion() + ".aliyuncs.com"); response.setExpire(expireEndTime / 1000); return response; } + private static Map getStringObjectMap(OssPlicyReq ossPlicyReq, long expireEndTime) { + Date expiration = new Date(expireEndTime); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + String expire = df.format(expiration); + + // 创建policy - 使用标准的JSON结构 + Map policyMap = new HashMap<>(); + policyMap.put("expiration", expire); + + // 构造conditions数组 + List conditions = new ArrayList<>(); + + // bucket条件 + Map bucketCondition = new HashMap<>(); + bucketCondition.put("bucket", ossPlicyReq.getBucketName()); + conditions.add(bucketCondition); + + // 可选:添加目录前缀条件 + if (ossPlicyReq.getDir() != null && !ossPlicyReq.getDir().isEmpty()) { + List startsWithCondition = new ArrayList<>(); + startsWithCondition.add("starts-with"); + startsWithCondition.add("$key"); + startsWithCondition.add(ossPlicyReq.getDir() + "/"); + conditions.add(startsWithCondition); + } + + policyMap.put("conditions", conditions); + return policyMap; + } + /** * 计算签名 * @param accessKeySecret