From 08c8384ae7bda5f05b6951b4d4b96e041b95fe31 Mon Sep 17 00:00:00 2001
From: masc <59968873@qq.com>
Date: Sun, 14 Jul 2024 22:39:34 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E4=BA=8C=E5=BC=80=E5=8A=A0=E5=85=A5Minio,?=
=?UTF-8?q?=E6=9A=82=E5=81=9C=E4=BD=BF=E7=94=A8ES?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 20 +-
.../teriteri/backend/config/OSSConfig.java | 32 --
.../config/properties/MinioProperties.java | 50 +++
.../config/properties/OssProperties.java | 40 ++
.../backend/controller/TestControlelr.java | 33 ++
.../teriteri/backend/enums/FilePathEnum.java | 57 +++
.../backend/enums/FileUploadModeEnum.java | 48 +++
.../backend/pojo/dto/UploadFileDto.java | 81 ++++
.../service/impl/user/UserServiceImpl.java | 10 +-
.../impl/video/DirectVideoUploadConsumer.java | 6 +-
.../service/impl/video/VideoServiceImpl.java | 8 +-
.../impl/video/VideoUploadServiceImpl.java | 9 +-
.../backend/strategy/UploadStrategy.java | 18 +
.../context/UploadStrategyContext.java | 38 ++
.../impl/login/LoginStrategyImpl.java | 9 +
.../impl/upload/AbstractUploadStrategy.java | 76 ++++
.../impl/upload/MinioUploadStrategyImpl.java | 131 ++++++
.../impl/upload/OssUploadStrategyImpl.java | 117 +++++
.../com/teriteri/backend/utils/ESUtil.java | 51 +--
.../backend/utils/FileUploadUtil.java | 406 ++++++++++++++++++
.../com/teriteri/backend/utils/OssUtil.java | 246 -----------
.../com/teriteri/backend/utils/RedisUtil.java | 2 +-
.../backend/BackendApplicationTests.java | 17 +-
...plication => "\344\272\214\345\274\200.md" | 77 +++-
24 files changed, 1236 insertions(+), 346 deletions(-)
delete mode 100644 src/main/java/com/teriteri/backend/config/OSSConfig.java
create mode 100644 src/main/java/com/teriteri/backend/config/properties/MinioProperties.java
create mode 100644 src/main/java/com/teriteri/backend/config/properties/OssProperties.java
create mode 100644 src/main/java/com/teriteri/backend/controller/TestControlelr.java
create mode 100644 src/main/java/com/teriteri/backend/enums/FilePathEnum.java
create mode 100644 src/main/java/com/teriteri/backend/enums/FileUploadModeEnum.java
create mode 100644 src/main/java/com/teriteri/backend/pojo/dto/UploadFileDto.java
create mode 100644 src/main/java/com/teriteri/backend/strategy/UploadStrategy.java
create mode 100644 src/main/java/com/teriteri/backend/strategy/context/UploadStrategyContext.java
create mode 100644 src/main/java/com/teriteri/backend/strategy/impl/login/LoginStrategyImpl.java
create mode 100644 src/main/java/com/teriteri/backend/strategy/impl/upload/AbstractUploadStrategy.java
create mode 100644 src/main/java/com/teriteri/backend/strategy/impl/upload/MinioUploadStrategyImpl.java
create mode 100644 src/main/java/com/teriteri/backend/strategy/impl/upload/OssUploadStrategyImpl.java
create mode 100644 src/main/java/com/teriteri/backend/utils/FileUploadUtil.java
delete mode 100644 src/main/java/com/teriteri/backend/utils/OssUtil.java
rename src/main/resources/application => "\344\272\214\345\274\200.md" (71%)
diff --git a/pom.xml b/pom.xml
index c7c7106..5134890 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,19 @@
7.17.16
-
+
+
+
+ io.minio
+ minio
+ 8.2.2
+
+
+
+ cn.hutool
+ hutool-all
+ 5.8.18
+
com.alibaba
@@ -216,8 +228,12 @@
spring-boot-starter-test
test
+
+ org.springframework
+ spring-test
+
-
+
diff --git a/src/main/java/com/teriteri/backend/config/OSSConfig.java b/src/main/java/com/teriteri/backend/config/OSSConfig.java
deleted file mode 100644
index 87ba6be..0000000
--- a/src/main/java/com/teriteri/backend/config/OSSConfig.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.teriteri.backend.config;
-
-import com.aliyun.oss.ClientBuilderConfiguration;
-import com.aliyun.oss.OSS;
-import com.aliyun.oss.OSSClientBuilder;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class OSSConfig {
- @Value("${oss.endpoint}")
- private String OSS_ENDPOINT;
-
- @Value("${oss.keyId}")
- private String ACCESS_KEY_ID;
-
- @Value("${oss.keySecret}")
- private String ACCESS_KEY_SECRET;
-
- @Value("${oss.idleTimeout}")
- private long IDLE_TIMEOUT;
-
- @Bean(destroyMethod = "shutdown")
- public OSS ossClient() {
- ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
- //连接空闲超时时间,超时则关闭
- conf.setIdleConnectionTime(IDLE_TIMEOUT);
- // 创建OSSClient实例
- return new OSSClientBuilder().build(OSS_ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET, conf);
- }
-}
diff --git a/src/main/java/com/teriteri/backend/config/properties/MinioProperties.java b/src/main/java/com/teriteri/backend/config/properties/MinioProperties.java
new file mode 100644
index 0000000..2b46e94
--- /dev/null
+++ b/src/main/java/com/teriteri/backend/config/properties/MinioProperties.java
@@ -0,0 +1,50 @@
+package com.teriteri.backend.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+
+/**
+ * @author 码头薯条Pro
+ * @date 2024/7/14 11:01
+ *
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = MinioProperties.PREFIX)
+public class MinioProperties {
+ /**
+ * 配置前缀
+ */
+ public static final String PREFIX = "upload.minio";
+
+ /**
+ * 对象存储服务的URL
+ */
+ private String endpoint;
+
+ /**
+ * Access key 账户ID
+ */
+ private String accessKey;
+
+ /**
+ * Secret key 密码
+ */
+ private String secretKey;
+
+ /**
+ * 默认的存储桶名称
+ */
+ private String bucketName;
+ /**
+ * 分片存储的临时桶
+ */
+ private String bucketNameSlice;
+ /**
+ * 可上传的文件后缀名
+ */
+ private List fileExt;
+}
diff --git a/src/main/java/com/teriteri/backend/config/properties/OssProperties.java b/src/main/java/com/teriteri/backend/config/properties/OssProperties.java
new file mode 100644
index 0000000..43b2338
--- /dev/null
+++ b/src/main/java/com/teriteri/backend/config/properties/OssProperties.java
@@ -0,0 +1,40 @@
+package com.teriteri.backend.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author 码头薯条Pro
+ * @date 2024/7/14 11:00
+ * oss配置属性
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "upload.oss")
+public class OssProperties {
+ /**
+ * oss域名
+ */
+ private String url;
+
+ /**
+ * 终点
+ */
+ private String endpoint;
+
+ /**
+ * 访问密钥id
+ */
+ private String accessKeyId;
+
+ /**
+ * 访问密钥密码
+ */
+ private String accessKeySecret;
+
+ /**
+ * bucket名称
+ */
+ private String bucketName;
+}
diff --git a/src/main/java/com/teriteri/backend/controller/TestControlelr.java b/src/main/java/com/teriteri/backend/controller/TestControlelr.java
new file mode 100644
index 0000000..ae8c3c0
--- /dev/null
+++ b/src/main/java/com/teriteri/backend/controller/TestControlelr.java
@@ -0,0 +1,33 @@
+package com.teriteri.backend.controller;
+
+import com.teriteri.backend.utils.FileUploadUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * @author 码头薯条Pro
+ * @date 2024/7/13 19:36
+ * map) throws IOException {
+ String hash = map.get("hash");
+ // 合并到OSS,并返回URL地址
+ String url = fileUploadUtil.appendUploadVideo(hash);
+
+ return url;
+ }
+
+
+}
diff --git a/src/main/java/com/teriteri/backend/enums/FilePathEnum.java b/src/main/java/com/teriteri/backend/enums/FilePathEnum.java
new file mode 100644
index 0000000..c9ca886
--- /dev/null
+++ b/src/main/java/com/teriteri/backend/enums/FilePathEnum.java
@@ -0,0 +1,57 @@
+package com.teriteri.backend.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author 码头薯条Pro
+ * @date 2024/7/14 10:54
+ * 文件路径枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum FilePathEnum {
+
+ /**
+ * 头像路径
+ */
+ AVATAR("/avatar/", "/avatar", "头像路径"),
+
+ /**
+ * 文章图片路径
+ */
+ ARTICLE("/article/", "/article", "文章图片路径"),
+
+ /**
+ * 配置图片路径
+ */
+ CONFIG("/config/", "/config", "配置图片路径"),
+
+ /**
+ * 说说图片路径
+ */
+ TALK("/talk/", "/talk", "说说图片路径"),
+
+ /**
+ * 照片路径
+ */
+ PHOTO("/photo/", "/photo", "相册路径"),
+ /**
+ * 媒体
+ */
+ VIDEO("/media/", "/media", "相册路径");
+ /**
+ * 路径
+ */
+ private final String path;
+
+ /**
+ * 文件路径
+ */
+ private final String filePath;
+
+ /**
+ * 描述
+ */
+ private final String description;
+}
diff --git a/src/main/java/com/teriteri/backend/enums/FileUploadModeEnum.java b/src/main/java/com/teriteri/backend/enums/FileUploadModeEnum.java
new file mode 100644
index 0000000..e8c235d
--- /dev/null
+++ b/src/main/java/com/teriteri/backend/enums/FileUploadModeEnum.java
@@ -0,0 +1,48 @@
+package com.teriteri.backend.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author 码头薯条Pro
+ * @date 2024/7/14 10:43
+ * 上传模式枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum FileUploadModeEnum {
+ /**
+ * oss
+ */
+ OSS("oss", "ossUploadStrategyImpl"),
+
+ /**
+ * minio
+ */
+ MINIO("minio", "minioUploadStrategyImpl");
+
+ /**
+ * 模式
+ */
+ private final String mode;
+
+ /**
+ * 策略
+ */
+ private final String strategy;
+
+ /**
+ * 获取策略
+ *
+ * @param mode 模式
+ * @return 搜索策略
+ */
+ public static String getStrategy(String mode) {
+ for (FileUploadModeEnum value : FileUploadModeEnum.values()) {
+ if (value.getMode().equals(mode)) {
+ return value.getStrategy();
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/teriteri/backend/pojo/dto/UploadFileDto.java b/src/main/java/com/teriteri/backend/pojo/dto/UploadFileDto.java
new file mode 100644
index 0000000..8b50f4e
--- /dev/null
+++ b/src/main/java/com/teriteri/backend/pojo/dto/UploadFileDto.java
@@ -0,0 +1,81 @@
+package com.teriteri.backend.pojo.dto;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.Serializable;
+
+/**
+ * @author 码头薯条Pro
+ * @date 2024/7/14 10:18
+ * 上传文件DTO
+ */
+@Data
+public class UploadFileDto implements Serializable {
+ /**
+ * 标识列
+ */
+ private String uuid;
+ /**
+ * 需要上传的文件
+ */
+ private File localFile;
+ /**
+ * 需要上传的文件
+ */
+ private MultipartFile file;
+ /**
+ * 需要上传的文件 inputStream
+ */
+ private InputStream fileInputStream;
+ /**
+ * 文件Md5
+ */
+ private String fileMd5;
+ /**
+ * 文件原始名称
+ */
+ private String originalFileName;
+ /**
+ * 文件存储地址 上传路径
+ */
+ private String uploadPath;
+ /**
+ * 需要上传的文件名
+ */
+ private String fileName;
+ /**
+ * 0不需要分片 1需要分片
+ */
+ private Integer needSlice;
+ /**
+ * 第几个分片
+ */
+ private Integer indexSlice;
+ /**
+ * 总分片
+ */
+ private Integer totalSlice;
+ /**
+ * 分片追加的位置
+ */
+ private long position;
+ /**
+ * 分片的大小
+ */
+ private Double sliceFileSize;
+ /**
+ * 文件大小
+ */
+ private Double fileSize;
+ /**
+ * 桶名称
+ */
+ private String bucketName;
+ /**
+ * 是否上传;0:未上传,1:已上传
+ */
+ private Integer isUploaded;
+}
diff --git a/src/main/java/com/teriteri/backend/service/impl/user/UserServiceImpl.java b/src/main/java/com/teriteri/backend/service/impl/user/UserServiceImpl.java
index 3b1e936..ec97037 100644
--- a/src/main/java/com/teriteri/backend/service/impl/user/UserServiceImpl.java
+++ b/src/main/java/com/teriteri/backend/service/impl/user/UserServiceImpl.java
@@ -10,7 +10,7 @@
import com.teriteri.backend.service.user.UserService;
import com.teriteri.backend.service.video.VideoStatsService;
import com.teriteri.backend.utils.ESUtil;
-import com.teriteri.backend.utils.OssUtil;
+import com.teriteri.backend.utils.FileUploadUtil;
import com.teriteri.backend.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -45,9 +45,9 @@ public class UserServiceImpl implements UserService {
private ESUtil esUtil;
@Autowired
- private OssUtil ossUtil;
+ private FileUploadUtil fileUploadUtil;
- @Value("${oss.bucketUrl}")
+ @Value("${upload.oss.bucketName}")
private String OSS_BUCKET_URL;
@Autowired
@@ -227,7 +227,7 @@ public CustomResponse updateUserInfo(Integer uid, String nickname, String desc,
@Override
public CustomResponse updateUserAvatar(Integer uid, MultipartFile file) throws IOException {
// 保存封面到OSS,返回URL
- String avatar_url = ossUtil.uploadImage(file, "avatar");
+ String avatar_url = fileUploadUtil.uploadImage(file, "avatar");
// 查旧的头像地址
User user = userMapper.selectById(uid);
// 先更新数据库
@@ -240,7 +240,7 @@ public CustomResponse updateUserAvatar(Integer uid, MultipartFile file) throws I
if (user.getAvatar().startsWith(OSS_BUCKET_URL)) {
String filename = user.getAvatar().substring(OSS_BUCKET_URL.length());
// System.out.println("要删除的源文件:" + filename);
- ossUtil.deleteFiles(filename);
+ fileUploadUtil.deleteFiles(filename);
}
}, taskExecutor);
return new CustomResponse(200, "OK", avatar_url);
diff --git a/src/main/java/com/teriteri/backend/service/impl/video/DirectVideoUploadConsumer.java b/src/main/java/com/teriteri/backend/service/impl/video/DirectVideoUploadConsumer.java
index 1f90eb5..516cbc4 100644
--- a/src/main/java/com/teriteri/backend/service/impl/video/DirectVideoUploadConsumer.java
+++ b/src/main/java/com/teriteri/backend/service/impl/video/DirectVideoUploadConsumer.java
@@ -7,7 +7,7 @@
import com.teriteri.backend.pojo.VideoStats;
import com.teriteri.backend.pojo.dto.VideoUploadInfoDTO;
import com.teriteri.backend.utils.ESUtil;
-import com.teriteri.backend.utils.OssUtil;
+import com.teriteri.backend.utils.FileUploadUtil;
import com.teriteri.backend.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
@@ -45,7 +45,7 @@ public class DirectVideoUploadConsumer {
private RedisUtil redisUtil;
@Autowired
- private OssUtil ossUtil;
+ private FileUploadUtil fileUploadUtil;
@Autowired
private ESUtil esUtil;
@@ -108,7 +108,7 @@ public void handleMergeChunks(String jsonPayload) throws IOException {
// }
// 合并到OSS,并返回URL地址
- url = ossUtil.appendUploadVideo(vui.getHash());
+ url = fileUploadUtil.appendUploadVideo(vui.getHash());
if (url == null) {
return;
}
diff --git a/src/main/java/com/teriteri/backend/service/impl/video/VideoServiceImpl.java b/src/main/java/com/teriteri/backend/service/impl/video/VideoServiceImpl.java
index a1125aa..46788b3 100644
--- a/src/main/java/com/teriteri/backend/service/impl/video/VideoServiceImpl.java
+++ b/src/main/java/com/teriteri/backend/service/impl/video/VideoServiceImpl.java
@@ -13,7 +13,7 @@
import com.teriteri.backend.service.video.VideoService;
import com.teriteri.backend.service.video.VideoStatsService;
import com.teriteri.backend.utils.ESUtil;
-import com.teriteri.backend.utils.OssUtil;
+import com.teriteri.backend.utils.FileUploadUtil;
import com.teriteri.backend.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
@@ -58,7 +58,7 @@ public class VideoServiceImpl implements VideoService {
private RedisUtil redisUtil;
@Autowired
- private OssUtil ossUtil;
+ private FileUploadUtil fileUploadUtil;
@Autowired
private ESUtil esUtil;
@@ -442,8 +442,8 @@ public CustomResponse updateVideoStatus(Integer vid, Integer status) throws IOEx
redisUtil.delValue("danmu_idset:" + vid); // 删除该视频的弹幕
redisUtil.zsetDelMember("user_video_upload:" + video.getUid(), video.getVid());
// 搞个异步线程去删除OSS的源文件
- CompletableFuture.runAsync(() -> ossUtil.deleteFiles(videoPrefix), taskExecutor);
- CompletableFuture.runAsync(() -> ossUtil.deleteFiles(coverPrefix), taskExecutor);
+ CompletableFuture.runAsync(() -> fileUploadUtil.deleteFiles(videoPrefix), taskExecutor);
+ CompletableFuture.runAsync(() -> fileUploadUtil.deleteFiles(coverPrefix), taskExecutor);
// 批量删除该视频下的全部评论缓存
CompletableFuture.runAsync(() -> {
Set