|
|
@@ -60,10 +60,14 @@ public class OssClientService {
|
|
|
this.userKeyService = userKeyService;
|
|
|
}
|
|
|
|
|
|
- public Result getSignedUrl(String objectId, String action) {
|
|
|
+ public Result getSignedUrl(String objectId, String action, String objectUrl) {
|
|
|
+ if (objectUrl != null && !objectUrl.isBlank()) {
|
|
|
+ return getSignedUrl0(objectId, objectUrl);
|
|
|
+ }
|
|
|
+
|
|
|
long loginUser = UserContext.getUserId();
|
|
|
- ObjectMeta objectMeta = objectRepository.getObjectMetaById(objectId, loginUser);
|
|
|
- if (objectMeta == null) {
|
|
|
+ objectUrl = getObjectUrl(objectId, loginUser);
|
|
|
+ if (objectUrl == null) {
|
|
|
return Result.fail("Object not exist");
|
|
|
}
|
|
|
|
|
|
@@ -84,30 +88,72 @@ public class OssClientService {
|
|
|
|
|
|
// 3. 调用工具类生成签名
|
|
|
String sign = SignatureUtils.calculateSignature(accessKeyId, expires, objectId);
|
|
|
+ String signedParams = String.format("ak=%s&t=%s&nonce=%s&sign=%s", accessKeyId, expires, nonce, sign);;
|
|
|
+
|
|
|
+ // 4. 拼接最终的公网访问 URL
|
|
|
+ // 格式:域名 + objectId + 参数
|
|
|
+ String signedUrl = String.format("%s?%s", objectUrl, signedParams);
|
|
|
+ Result result = Result.success(signedUrl);
|
|
|
+
|
|
|
+ Result result0 = getSignedUrl0(objectId, objectUrl);
|
|
|
+ return result0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getObjectUrl(String objectId, long loginUser) {
|
|
|
+ ObjectMeta objectMeta = objectRepository.getObjectMetaById(objectId, loginUser);
|
|
|
+ if (objectMeta == null) {
|
|
|
+ //return Result.fail("Object not exist");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
String objectName = objectMeta.getObjectName();
|
|
|
UploadChannel uploadChannel = getUploadChannel(loginUser, objectName);
|
|
|
if (uploadChannel == null) {
|
|
|
- return Result.fail("UploadChannel not found");
|
|
|
+ //return Result.fail("UploadChannel not found");
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
int userNodeId = uploadChannel.getUserNodeId();
|
|
|
UserNode userNode = userNodeService.getUserNode(userNodeId);
|
|
|
if (userNode == null) {
|
|
|
- return Result.fail("UserNode not found");
|
|
|
+ //return Result.fail("UserNode not found");
|
|
|
+ return null;
|
|
|
}
|
|
|
-
|
|
|
String protocol = userNode.getProtocol();
|
|
|
String domain = userNode.getDomain();
|
|
|
- String ossUrl = String.format("%s://%s", protocol, domain);
|
|
|
+ String objectUrl = String.format("%s://%s/%s", protocol, domain, objectName);
|
|
|
+ return objectUrl;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Result getSignedUrl0(String objectId, String objectUrl) {
|
|
|
+ long loginUser = UserContext.getUserId();
|
|
|
+ // 24h
|
|
|
+ int durationInMinutes = 1440;
|
|
|
+ // 2. 计算过期时间(当前时间 + 持续分钟数)
|
|
|
+ long expires = (System.currentTimeMillis() / 1000) + (durationInMinutes * 60L);
|
|
|
+
|
|
|
+ UserKey userKey = userKeyService.getUserKey(loginUser);
|
|
|
+ if (userKey == null) {
|
|
|
+ return Result.fail("UserKey not exist");
|
|
|
+ }
|
|
|
+ String accessKeyId = userKey.getAccessKeyId();
|
|
|
+
|
|
|
+ // 生成一个短随机数,例如 UUID 的前 8 位或随机 16 进制字符串
|
|
|
+ // 避免重放攻击, 使 url 只能访问一次
|
|
|
+ String nonce = UUID.randomUUID().toString().substring(0, 8);
|
|
|
+
|
|
|
+ // 3. 调用工具类生成签名
|
|
|
+ String sign = SignatureUtils.calculateSignature(accessKeyId, expires, objectId);
|
|
|
String signedParams = String.format("ak=%s&t=%s&nonce=%s&sign=%s", accessKeyId, expires, nonce, sign);;
|
|
|
|
|
|
// 4. 拼接最终的公网访问 URL
|
|
|
// 格式:域名 + objectId + 参数
|
|
|
- String signedUrl = String.format("%s/%s?%s", ossUrl, objectName, signedParams);
|
|
|
+ String signedUrl = String.format("%s?%s", objectUrl, signedParams);
|
|
|
return Result.success(signedUrl);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
private UploadChannel getUploadChannel(long loginUser, String objectName) {
|
|
|
List<UploadChannel> uploadChannelList = uploadChannelService.getUploadChannelsByCreateBy(loginUser);
|
|
|
Collections.reverse(uploadChannelList);
|