From a3f13d689d8edef1dba2b4afb7ac04cfe17d48af Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Tue, 30 Jun 2026 17:29:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Qiniu=20=E8=AF=BB=E5=8F=96=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20SDK=20Client=20+=20Region=20ioHost=20=E5=9F=9F?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../par/core/storage/QiniuStorageService.java | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/par-core/src/main/java/com/par/core/storage/QiniuStorageService.java b/par-core/src/main/java/com/par/core/storage/QiniuStorageService.java index b6c7412..c6f2926 100644 --- a/par-core/src/main/java/com/par/core/storage/QiniuStorageService.java +++ b/par-core/src/main/java/com/par/core/storage/QiniuStorageService.java @@ -1,6 +1,8 @@ package com.par.core.storage; import com.qiniu.common.QiniuException; +import com.qiniu.http.Client; +import com.qiniu.http.Response; import com.qiniu.storage.BucketManager; import com.qiniu.storage.Configuration; import com.qiniu.storage.Region; @@ -9,12 +11,6 @@ import com.qiniu.util.Auth; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.time.Duration; - /** * 七牛云存储。 * 每次调用时从环境变量读取配置,支持热更新无需重启。 @@ -23,36 +19,34 @@ import java.time.Duration; @Service public class QiniuStorageService implements StorageService { - private final HttpClient httpClient = HttpClient.newBuilder() - .connectTimeout(Duration.ofSeconds(5)) - .followRedirects(HttpClient.Redirect.NORMAL) - .build(); - private UploadManager uploadManager; private BucketManager bucketManager; + private Client qiniuClient; private Auth auth; private String bucket; - private String downloadDomain; + private String ioHost; private synchronized void ensureInit() { if (bucket != null) return; String ak = env("QINIU_AK"); String sk = env("QINIU_SK"); - String region = env("QINIU_REGION", "z2"); + String regionStr = env("QINIU_REGION", "z2"); this.bucket = env("QINIU_BUCKET", "par-configs"); - this.downloadDomain = env("QINIU_DOWNLOAD_DOMAIN", "http://" + bucket + ".qiniudn.com"); this.auth = Auth.create(ak, sk); - Configuration cfg = new Configuration(switch (region) { + Region region = switch (regionStr) { case "z0" -> Region.region0(); case "z1" -> Region.region1(); case "z2" -> Region.region2(); case "na0" -> Region.regionNa0(); case "as0" -> Region.regionAs0(); default -> Region.autoRegion(); - }); + }; + Configuration cfg = new Configuration(region); + this.ioHost = region.getIovipHost(ak); this.uploadManager = new UploadManager(cfg); this.bucketManager = new BucketManager(auth, cfg); - log.info("Qiniu 存储就绪: bucket={}", bucket); + this.qiniuClient = new Client(cfg); + log.info("Qiniu 存储就绪: bucket={}, ioHost={}", bucket, ioHost); } @Override @@ -70,17 +64,15 @@ public class QiniuStorageService implements StorageService { @Override public String read(String path) { ensureInit(); - // 使用配置的下载域名生成私密下载链接 - String baseUrl = downloadDomain.endsWith("/") ? downloadDomain + path : downloadDomain + "/" + path; + // 通过 SDK Client + 区域 ioHost 私密下载 + String baseUrl = "http://" + ioHost + "/" + path; String signedUrl = auth.privateDownloadUrl(baseUrl, 3600); try { - var req = HttpRequest.newBuilder().uri(URI.create(signedUrl)) - .timeout(Duration.ofSeconds(10)).GET().build(); - var resp = httpClient.send(req, HttpResponse.BodyHandlers.ofString()); - if (resp.statusCode() == 200) return resp.body(); - log.warn("Qiniu 读取失败 {}: HTTP {} (domain={})", path, resp.statusCode(), downloadDomain); - } catch (Exception e) { - log.warn("Qiniu 读取失败 {}: {}", path, e.getMessage()); + Response resp = qiniuClient.get(signedUrl); + if (resp.isOK()) return resp.bodyString(); + log.warn("Qiniu 读取失败 {}: HTTP {}", path, resp.statusCode); + } catch (QiniuException e) { + log.warn("Qiniu 读取失败 {}: {}", path, e.response != null ? e.response.error : e.getMessage()); } return null; }