Преглед изворни кода

新增oss上传公共模块

mac пре 2 година
родитељ
комит
f80e6b4663

+ 6 - 2
kxs-common/kxs-common-oss/pom.xml

@@ -21,8 +21,12 @@
     <dependencies>
         <!--hutool-->
         <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-core</artifactId>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
         </dependency>
     </dependencies>
 </project>

+ 39 - 0
kxs-common/kxs-common-oss/src/main/java/com/kxs/common/file/oss/OssAutoConfiguration.java

@@ -0,0 +1,39 @@
+
+package com.kxs.common.file.oss;
+
+import com.kxs.common.file.oss.core.FileProperties;
+import com.kxs.common.file.oss.http.OssEndpoint;
+import com.kxs.common.file.oss.service.OssTemplate;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+
+/**
+ * 自动配置类
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-18
+ */
+@AllArgsConstructor
+@EnableConfigurationProperties({ FileProperties.class })
+public class OssAutoConfiguration {
+
+	private final FileProperties properties;
+
+	@Bean
+	@Primary
+	@ConditionalOnMissingBean(OssTemplate.class)
+	public OssTemplate ossTemplate() {
+		return new OssTemplate(properties);
+	}
+
+	@Bean
+	@ConditionalOnMissingBean
+	public OssEndpoint ossEndpoint(OssTemplate template) {
+		return new OssEndpoint(template);
+	}
+
+}

+ 42 - 0
kxs-common/kxs-common-oss/src/main/java/com/kxs/common/file/oss/core/FileProperties.java

@@ -0,0 +1,42 @@
+
+package com.kxs.common.file.oss.core;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 文件 配置信息
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-18
+ */
+@Data
+@ConfigurationProperties(prefix = "file.oss")
+public class FileProperties {
+
+	/**
+	 * 默认的存储桶名称
+	 */
+	private String bucketName;
+
+	/**
+	 * 文件前缀
+	 */
+	private String filePrefix;
+
+	/**
+	 * 对象存储服务的URL
+	 */
+	private String endpoint;
+
+	/**
+	 * Access key
+	 */
+	private String accessKey = "LTA15tJsPaNzgCsMCPwb8zfz";
+
+	/**
+	 * Secret key
+	 */
+	private String secretKey = "efl31Up75fOcg232U6xvAciagceQae";
+
+}

+ 39 - 0
kxs-common/kxs-common-oss/src/main/java/com/kxs/common/file/oss/http/OssEndpoint.java

@@ -0,0 +1,39 @@
+
+package com.kxs.common.file.oss.http;
+
+import com.kxs.common.core.util.R;
+import com.kxs.common.file.oss.service.OssTemplate;
+import com.kxs.common.file.oss.vo.PolicyVO;
+import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 对外提供服务端点
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-18
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("oss")
+public class OssEndpoint {
+
+	private final OssTemplate template;
+
+
+	/**
+	 * 上传文件获取前置验证资料
+	 *
+	 * @return {@link R}
+	 */
+	@SneakyThrows
+	@GetMapping("policy")
+	public R<PolicyVO> policy() {
+
+		return template.getPolicy();
+	}
+}

+ 78 - 0
kxs-common/kxs-common-oss/src/main/java/com/kxs/common/file/oss/service/OssTemplate.java

@@ -0,0 +1,78 @@
+
+package com.kxs.common.file.oss.service;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.util.StrUtil;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.MatchMode;
+import com.aliyun.oss.model.PolicyConditions;
+import com.kxs.common.core.util.R;
+import com.kxs.common.file.oss.core.FileProperties;
+import com.kxs.common.file.oss.vo.PolicyVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.InitializingBean;
+
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.UUID;
+
+
+/**
+ * 实现oss
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-18
+ */
+@RequiredArgsConstructor
+public class OssTemplate implements InitializingBean {
+
+	private final FileProperties properties;
+
+	private final String fileModel = "app";
+
+	private OSS ossClient;
+
+	public R<PolicyVO> getPolicy() {
+
+		String format = LocalDate.now().format(DatePattern.NORM_DATE_FORMATTER);
+		// 用户上传文件时指定的前缀。
+		String dir = properties.getFilePrefix() + StrUtil.SLASH + format + StrUtil.SLASH + UUID.randomUUID();
+		//上传过期时间
+		long expireEndTime = System.currentTimeMillis() + 30 * 1000;
+		Date expiration = new Date(expireEndTime);
+		// PostObject请求最大可支持的即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
+		PolicyConditions policyCords = new PolicyConditions();
+		policyCords.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 20*1024);
+		policyCords.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
+
+		String postPolicy = ossClient.generatePostPolicy(expiration, policyCords);
+		byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
+		String encodedPolicy = BinaryUtil.toBase64String(binaryData);
+		String postSignature = ossClient.calculatePostSignature(postPolicy);
+
+		return R.ok(PolicyVO.builder().accessKey(properties.getAccessKey())
+				.policy(encodedPolicy)
+				.signature(postSignature)
+				.dir(dir).host("https://" +  properties.getBucketName() + StrUtil.DOT + properties.getEndpoint())
+				.expire(String.valueOf(expireEndTime / 1000)).build()
+		);
+	}
+
+	/**
+	 * 配置oss客户端
+	 *
+     */
+	@Override
+	public void afterPropertiesSet() {
+
+		// 创建OSSClient实例。
+		this.ossClient = new OSSClientBuilder().
+				build(properties.getEndpoint(), properties.getAccessKey(), properties.getSecretKey());
+	}
+
+}

+ 33 - 0
kxs-common/kxs-common-oss/src/main/java/com/kxs/common/file/oss/vo/PolicyVO.java

@@ -0,0 +1,33 @@
+package com.kxs.common.file.oss.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 政策 vo
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-18
+ */
+@Data
+@Builder
+public class PolicyVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private String accessKey;
+
+    private String policy;
+
+    private String signature;
+
+    private String dir;
+
+    private String host;
+
+    private String expire;
+}

+ 1 - 0
kxs-common/kxs-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+com.kxs.common.file.oss.OssAutoConfiguration

+ 1 - 0
kxs-common/pom.xml

@@ -23,6 +23,7 @@
         <module>kxs-common-mybatis</module>
         <module>kxs-common-swagger</module>
         <module>kxs-common-seata</module>
+        <module>kxs-common-oss</module>
     </modules>
     <dependencyManagement>
         <dependencies>

+ 4 - 0
kxs-system/kxs-system-biz/pom.xml

@@ -89,6 +89,10 @@
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-poi</artifactId>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.kxs</groupId>-->
+<!--            <artifactId>kxs-common-oss</artifactId>-->
+<!--        </dependency>-->
     </dependencies>
 
     <build>

+ 16 - 4
pom.xml

@@ -37,6 +37,7 @@
         <kxs.common.version>${project.version}</kxs.common.version>
         <knife4j.version>4.3.0</knife4j.version>
         <fastjson.version>1.2.83</fastjson.version>
+        <oss.version>3.15.1</oss.version>
     </properties>
 
     <!-- 以下依赖 全局所有的模块都会引入  -->
@@ -81,7 +82,6 @@
         <module>kxs-product</module>
         <module>kxs-visual</module>
         <module>kxs-transfer</module>
-        <module>kxs-common/kxs-common-oss</module>
     </modules>
 
     <dependencyManagement>
@@ -189,6 +189,7 @@
                 <artifactId>mybatis-plus-annotation</artifactId>
                 <version>${mybatis-plus.version}</version>
             </dependency>
+
             <!-- 多数据源依赖 -->
             <dependency>
                 <groupId>com.baomidou</groupId>
@@ -201,6 +202,16 @@
                 <artifactId>excel-spring-boot-starter</artifactId>
                 <version>${excel.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.aliyun.oss</groupId>
+                <artifactId>aliyun-sdk-oss</artifactId>
+                <version>${oss.version}</version>
+            </dependency>
             <!-- 鉴权 -->
             <dependency>
                 <groupId>com.kxs</groupId>
@@ -224,12 +235,13 @@
                 <version>${project.version}</version>
             </dependency>
             <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>fastjson</artifactId>
-                <version>${fastjson.version}</version>
+                <groupId>com.kxs</groupId>
+                <artifactId>kxs-common-oss</artifactId>
+                <version>${project.version}</version>
             </dependency>
 
 
+
             <!-- 系统管理模块 -->
             <dependency>
                 <groupId>com.kxs</groupId>