|
@@ -0,0 +1,78 @@
|
|
|
|
|
+package cn.reghao.tnb.file.app.service;
|
|
|
|
|
+
|
|
|
|
|
+import com.aliyun.oss.OSS;
|
|
|
|
|
+import com.aliyun.oss.OSSClientBuilder;
|
|
|
|
|
+import com.aliyun.oss.common.utils.BinaryUtil;
|
|
|
|
|
+import com.aliyun.oss.model.PolicyConditions;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+
|
|
|
|
|
+import java.net.URL;
|
|
|
|
|
+import java.util.Date;
|
|
|
|
|
+import java.util.LinkedHashMap;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author reghao
|
|
|
|
|
+ * @date 2026-06-15 15:25:46
|
|
|
|
|
+ */
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+public class AliyunOss {
|
|
|
|
|
+ private final OSS ossClient;
|
|
|
|
|
+ private String endpoint;
|
|
|
|
|
+ private String accessKeyId;
|
|
|
|
|
+ private String bucketName;
|
|
|
|
|
+ private final String host;
|
|
|
|
|
+
|
|
|
|
|
+ public AliyunOss(String endpoint, String accessKeyId, String accessKeySecret, String bucketName) {
|
|
|
|
|
+ this.ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
|
|
|
|
|
+ this.endpoint = endpoint;
|
|
|
|
|
+ this.accessKeyId = accessKeyId;
|
|
|
|
|
+ this.bucketName = bucketName;
|
|
|
|
|
+ this.host = "https://" + bucketName + "." + endpoint;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Map<String, Object> getOssSignature() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ long expireTime = 3600; // 签名有效期 1 小时 (秒)
|
|
|
|
|
+ long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
|
|
|
|
|
+ Date expiration = new Date(expireEndTime);
|
|
|
|
|
+
|
|
|
|
|
+ // 设置上传限制条件
|
|
|
|
|
+ PolicyConditions policyConds = new PolicyConditions();
|
|
|
|
|
+ policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 104857600); // 100MB
|
|
|
|
|
+
|
|
|
|
|
+ // 生成 Policy 字符串
|
|
|
|
|
+ String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
|
|
|
|
|
+ byte[] binaryData = postPolicy.getBytes("utf-8");
|
|
|
|
|
+ String encodedPolicy = BinaryUtil.toBase64String(binaryData);
|
|
|
|
|
+
|
|
|
|
|
+ // 生成加密签名 Signature
|
|
|
|
|
+ String postSignature = ossClient.calculatePostSignature(postPolicy);
|
|
|
|
|
+
|
|
|
|
|
+ // 组装返回给前端的 JSON 格式
|
|
|
|
|
+ Map<String, Object> respMap = new LinkedHashMap<>();
|
|
|
|
|
+ respMap.put("host", host);
|
|
|
|
|
+ respMap.put("OSSAccessKeyId", accessKeyId);
|
|
|
|
|
+ respMap.put("policy", encodedPolicy);
|
|
|
|
|
+ respMap.put("signature", postSignature);
|
|
|
|
|
+ respMap.put("expire", expireEndTime / 1000);
|
|
|
|
|
+ return respMap;
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error(e.getMessage());
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public String getSignedUrl(String objectName) {
|
|
|
|
|
+ int expireSecond = 3600;
|
|
|
|
|
+ long timestamp = System.currentTimeMillis() + expireSecond*1000L;
|
|
|
|
|
+ Date expiration = new Date(timestamp);
|
|
|
|
|
+ URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
|
|
|
|
|
+ return url.toString();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void close() {
|
|
|
|
|
+ ossClient.shutdown();
|
|
|
|
|
+ }
|
|
|
|
|
+}
|