fix: Qiniu 读取使用 SDK Client + Region ioHost 域名
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user