From 305ee5ad2a4fe927a1fcf04fb58eb9f6fdc2eb95 Mon Sep 17 00:00:00 2001 From: wuchenxi03 Date: Tue, 8 Jul 2025 16:43:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=98=BF=E9=87=8C?= =?UTF-8?q?=E4=BA=91oss=E8=8E=B7=E5=8F=96=E4=B8=B4=E6=97=B6=E6=96=87?= =?UTF-8?q?=E4=BB=B6url=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aliyun-oss-solon-cloud-plugin/pom.xml | 8 ++++- .../cloud/extend/aliyun/oss/XPluginImp.java | 7 +++++ .../oss/service/CloudFileServiceOssImpl.java | 31 ++++++++++++++++++- .../src/test/java/demo/DemoTest.java | 10 ++++-- 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml index e09d539b..49074770 100644 --- a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml +++ b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml @@ -38,6 +38,12 @@ solon-test test + + + com.aliyun.oss + aliyun-sdk-oss + 3.18.3 + - \ No newline at end of file + diff --git a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java index 4dda391c..bee1f45e 100644 --- a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java +++ b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java @@ -39,4 +39,11 @@ public class XPluginImp implements Plugin { CloudManager.register(new CloudFileServiceOssImpl(cloudProps)); } } + + @Override + public void stop() { + if (CloudFileServiceOssImpl.client != null) { + CloudFileServiceOssImpl.client.shutdown(); + } + } } diff --git a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java index 226ff6b2..2d578e37 100644 --- a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java +++ b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java @@ -15,6 +15,10 @@ */ package org.noear.solon.cloud.extend.aliyun.oss.service; +import com.aliyun.oss.ClientBuilderConfiguration; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.common.comm.Protocol; import org.noear.solon.Utils; import org.noear.solon.cloud.CloudProps; import org.noear.solon.cloud.exception.CloudFileException; @@ -38,6 +42,7 @@ import java.util.*; public class CloudFileServiceOssImpl implements CloudFileService { private static final String CHARSET_UTF8 = "utf8"; private static final String ALGORITHM = "HmacSHA1"; + public static OSS client; private final String bucketDef; @@ -69,6 +74,26 @@ public class CloudFileServiceOssImpl implements CloudFileService { this.secretKey = secretKey; } + public OSS getClient() { + if (client != null) { + return client; + } + synchronized (this) { + if (client != null) { + return client; + } + ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); + clientBuilderConfiguration.setSupportCname(true); + clientBuilderConfiguration.setProtocol(Protocol.HTTPS); + clientBuilderConfiguration.setMaxConnections(200); + clientBuilderConfiguration.setConnectionTimeout(5000); + clientBuilderConfiguration.setMaxErrorRetry(3); + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey, clientBuilderConfiguration); + CloudFileServiceOssImpl.client = ossClient; + return ossClient; + } + } + @Override public boolean exists(String bucket, String key) throws CloudFileException { @@ -103,7 +128,11 @@ public class CloudFileServiceOssImpl implements CloudFileService { @Override public String getTempUrl(String bucket, String key, Duration duration) throws CloudFileException, UnsupportedOperationException { - throw new UnsupportedOperationException(); + if (Utils.isEmpty(bucket)) { + bucket = bucketDef; + } + Date expiration = new Date(System.currentTimeMillis() + duration.getSeconds() * 1000); + return getClient().generatePresignedUrl(bucket, key, expiration).toString(); } @Override diff --git a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/test/java/demo/DemoTest.java b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/test/java/demo/DemoTest.java index a6887081..25414e0f 100644 --- a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/test/java/demo/DemoTest.java +++ b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/test/java/demo/DemoTest.java @@ -16,16 +16,15 @@ package demo; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.noear.solon.cloud.CloudClient; import org.noear.solon.cloud.model.Media; import org.noear.solon.core.handle.Result; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.time.Duration; /** * @author noear 2021/10/18 created @@ -60,4 +59,11 @@ public class DemoTest { System.out.println("times: " + (System.currentTimeMillis() - start)); } + + @Test + public void testGetTempUrl() { + CloudClient.file().put(key, media); + String url = CloudClient.file().getTempUrl(key, Duration.ofMinutes(10)); + System.out.println(url); + } } -- Gitee From e8c35037def74b35dbcd38fddaee86080bffdd0f Mon Sep 17 00:00:00 2001 From: wuchenxi03 Date: Tue, 8 Jul 2025 17:30:05 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=98=BF=E9=87=8C?= =?UTF-8?q?=E4=BA=91oss=E8=8E=B7=E5=8F=96=E4=B8=B4=E6=97=B6=E6=96=87?= =?UTF-8?q?=E4=BB=B6url=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aliyun-oss-solon-cloud-plugin/pom.xml | 6 --- .../cloud/extend/aliyun/oss/XPluginImp.java | 7 --- .../oss/service/CloudFileServiceOssImpl.java | 44 +++++++------------ 3 files changed, 17 insertions(+), 40 deletions(-) diff --git a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml index 49074770..d34e86c3 100644 --- a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml +++ b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/pom.xml @@ -38,12 +38,6 @@ solon-test test - - - com.aliyun.oss - aliyun-sdk-oss - 3.18.3 - diff --git a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java index bee1f45e..4dda391c 100644 --- a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java +++ b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/XPluginImp.java @@ -39,11 +39,4 @@ public class XPluginImp implements Plugin { CloudManager.register(new CloudFileServiceOssImpl(cloudProps)); } } - - @Override - public void stop() { - if (CloudFileServiceOssImpl.client != null) { - CloudFileServiceOssImpl.client.shutdown(); - } - } } diff --git a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java index 2d578e37..c073b5b0 100644 --- a/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java +++ b/solon-cloud-file/aliyun-oss-solon-cloud-plugin/src/main/java/org/noear/solon/cloud/extend/aliyun/oss/service/CloudFileServiceOssImpl.java @@ -15,10 +15,6 @@ */ package org.noear.solon.cloud.extend.aliyun.oss.service; -import com.aliyun.oss.ClientBuilderConfiguration; -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; -import com.aliyun.oss.common.comm.Protocol; import org.noear.solon.Utils; import org.noear.solon.cloud.CloudProps; import org.noear.solon.cloud.exception.CloudFileException; @@ -30,6 +26,7 @@ import org.noear.solon.net.http.HttpUtils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; +import java.net.URLEncoder; import java.time.Duration; import java.util.*; @@ -42,7 +39,6 @@ import java.util.*; public class CloudFileServiceOssImpl implements CloudFileService { private static final String CHARSET_UTF8 = "utf8"; private static final String ALGORITHM = "HmacSHA1"; - public static OSS client; private final String bucketDef; @@ -74,26 +70,6 @@ public class CloudFileServiceOssImpl implements CloudFileService { this.secretKey = secretKey; } - public OSS getClient() { - if (client != null) { - return client; - } - synchronized (this) { - if (client != null) { - return client; - } - ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); - clientBuilderConfiguration.setSupportCname(true); - clientBuilderConfiguration.setProtocol(Protocol.HTTPS); - clientBuilderConfiguration.setMaxConnections(200); - clientBuilderConfiguration.setConnectionTimeout(5000); - clientBuilderConfiguration.setMaxErrorRetry(3); - OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey, clientBuilderConfiguration); - CloudFileServiceOssImpl.client = ossClient; - return ossClient; - } - } - @Override public boolean exists(String bucket, String key) throws CloudFileException { @@ -131,8 +107,22 @@ public class CloudFileServiceOssImpl implements CloudFileService { if (Utils.isEmpty(bucket)) { bucket = bucketDef; } - Date expiration = new Date(System.currentTimeMillis() + duration.getSeconds() * 1000); - return getClient().generatePresignedUrl(bucket, key, expiration).toString(); + + try { + long expires = System.currentTimeMillis() / 1000 + duration.getSeconds(); + + String objPath = "/" + bucket + "/" + key; + String url = buildUrl(bucket, key); + + String signData = buildSignData("GET", Long.toString(expires), objPath, null); + String signature = hmacSha1(signData, secretKey); + + String encodedSignature = URLEncoder.encode(signature, CHARSET_UTF8); + + return url + "?Expires=" + expires + "&OSSAccessKeyId=" + accessKey + "&Signature=" + encodedSignature; + } catch (Exception ex) { + throw new CloudFileException(ex); + } } @Override -- Gitee