fix: Qiniu 读取使用 SDK Client + Region ioHost 域名

This commit is contained in:
mediabot-pt
2026-06-30 17:29:35 +08:00
parent 2ac5084566
commit a3f13d689d

View File

@@ -1,6 +1,8 @@
package com.par.core.storage; package com.par.core.storage;
import com.qiniu.common.QiniuException; import com.qiniu.common.QiniuException;
import com.qiniu.http.Client;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager; import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration; import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region; import com.qiniu.storage.Region;
@@ -9,12 +11,6 @@ import com.qiniu.util.Auth;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; 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 @Service
public class QiniuStorageService implements StorageService { public class QiniuStorageService implements StorageService {
private final HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
private UploadManager uploadManager; private UploadManager uploadManager;
private BucketManager bucketManager; private BucketManager bucketManager;
private Client qiniuClient;
private Auth auth; private Auth auth;
private String bucket; private String bucket;
private String downloadDomain; private String ioHost;
private synchronized void ensureInit() { private synchronized void ensureInit() {
if (bucket != null) return; if (bucket != null) return;
String ak = env("QINIU_AK"); String ak = env("QINIU_AK");
String sk = env("QINIU_SK"); 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.bucket = env("QINIU_BUCKET", "par-configs");
this.downloadDomain = env("QINIU_DOWNLOAD_DOMAIN", "http://" + bucket + ".qiniudn.com");
this.auth = Auth.create(ak, sk); this.auth = Auth.create(ak, sk);
Configuration cfg = new Configuration(switch (region) { Region region = switch (regionStr) {
case "z0" -> Region.region0(); case "z0" -> Region.region0();
case "z1" -> Region.region1(); case "z1" -> Region.region1();
case "z2" -> Region.region2(); case "z2" -> Region.region2();
case "na0" -> Region.regionNa0(); case "na0" -> Region.regionNa0();
case "as0" -> Region.regionAs0(); case "as0" -> Region.regionAs0();
default -> Region.autoRegion(); default -> Region.autoRegion();
}); };
Configuration cfg = new Configuration(region);
this.ioHost = region.getIovipHost(ak);
this.uploadManager = new UploadManager(cfg); this.uploadManager = new UploadManager(cfg);
this.bucketManager = new BucketManager(auth, 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 @Override
@@ -70,17 +64,15 @@ public class QiniuStorageService implements StorageService {
@Override @Override
public String read(String path) { public String read(String path) {
ensureInit(); ensureInit();
// 使用配置的下载域名生成私密下载链接 // 通过 SDK Client + 区域 ioHost 私密下载
String baseUrl = downloadDomain.endsWith("/") ? downloadDomain + path : downloadDomain + "/" + path; String baseUrl = "http://" + ioHost + "/" + path;
String signedUrl = auth.privateDownloadUrl(baseUrl, 3600); String signedUrl = auth.privateDownloadUrl(baseUrl, 3600);
try { try {
var req = HttpRequest.newBuilder().uri(URI.create(signedUrl)) Response resp = qiniuClient.get(signedUrl);
.timeout(Duration.ofSeconds(10)).GET().build(); if (resp.isOK()) return resp.bodyString();
var resp = httpClient.send(req, HttpResponse.BodyHandlers.ofString()); log.warn("Qiniu 读取失败 {}: HTTP {}", path, resp.statusCode);
if (resp.statusCode() == 200) return resp.body(); } catch (QiniuException e) {
log.warn("Qiniu 读取失败 {}: HTTP {} (domain={})", path, resp.statusCode(), downloadDomain); log.warn("Qiniu 读取失败 {}: {}", path, e.response != null ? e.response.error : e.getMessage());
} catch (Exception e) {
log.warn("Qiniu 读取失败 {}: {}", path, e.getMessage());
} }
return null; return null;
} }