diff --git a/bonus-modules/bonus-oss/pom.xml b/bonus-modules/bonus-oss/pom.xml
new file mode 100644
index 0000000..6c24002
--- /dev/null
+++ b/bonus-modules/bonus-oss/pom.xml
@@ -0,0 +1,103 @@
+
+
+ 4.0.0
+
+ com.bonus
+ bonus-modules
+ 3.6.4
+
+
+ bonus-modules-oss
+
+ bonus-modules-oss存储服务
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ com.github.tobato
+ fastdfs-client
+
+
+
+
+ io.minio
+ minio
+ ${minio.version}
+
+
+
+
+ com.bonus
+ bonus-api-system
+
+
+
+
+ com.bonus
+ bonus-common-swagger
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.10.2
+
+
+ com.mchange
+ mchange-commons-java
+ 0.2.15
+ compile
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/BonusOssApplication.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/BonusOssApplication.java
new file mode 100644
index 0000000..76abe12
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/BonusOssApplication.java
@@ -0,0 +1,25 @@
+package com.bonus.oss;
+
+import com.bonus.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+@EnableCustomSwagger2
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
+public class BonusOssApplication {
+ public static void main(String[] args)
+ {
+ SpringApplication.run(BonusOssApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ oss存储服务模块启动成功 ლ(´ڡ`ლ)゙ \n" +
+ " .-------. ____ __ \n" +
+ " | _ _ \\ \\ \\ / / \n" +
+ " | ( ' ) | \\ _. / ' \n" +
+ " |(_ o _) / _( )_ .' \n" +
+ " | (_,_).' __ ___(_ o _)' \n" +
+ " | |\\ \\ | || |(_,_)' \n" +
+ " | | \\ `' /| `-' / \n" +
+ " | | \\ / \\ / \n" +
+ " ''-' `'-' `-..-' ");
+ }
+}
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/config/OSSConfig.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/config/OSSConfig.java
new file mode 100644
index 0000000..5d0ac07
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/config/OSSConfig.java
@@ -0,0 +1,47 @@
+package com.bonus.oss.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "oss")
+public class OSSConfig {
+ private String accessKeyId;
+ private String accessKeySecret;
+ private String bucket;
+ private String endpoint;
+ // Getters and Setters
+
+ public String getAccessKeyId() {
+ return accessKeyId;
+ }
+
+ public void setAccessKeyId(String accessKeyId) {
+ this.accessKeyId = accessKeyId;
+ }
+
+ public String getAccessKeySecret() {
+ return accessKeySecret;
+ }
+
+ public void setAccessKeySecret(String accessKeySecret) {
+ this.accessKeySecret = accessKeySecret;
+ }
+
+ public String getBucket() {
+ return bucket;
+ }
+
+ public void setBucket(String bucket) {
+ this.bucket = bucket;
+ }
+
+ public String getEndpoint() {
+ return endpoint;
+ }
+
+ public void setEndpoint(String endpoint) {
+ this.endpoint = endpoint;
+ }
+
+}
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/controller/OssController.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/controller/OssController.java
new file mode 100644
index 0000000..4e38980
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/controller/OssController.java
@@ -0,0 +1,135 @@
+package com.bonus.oss.controller;
+
+import com.aliyun.oss.model.OSSObject;
+import com.bonus.common.core.domain.R;
+import com.bonus.oss.domain.OssInfo;
+import com.bonus.oss.service.OssService;
+import com.bonus.oss.utils.FileUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/oss")
+public class OssController {
+ @Resource
+ private OssService ossService;
+
+ /**
+ * 文件上传
+ *
+ * @param file 文件流
+ * @return 文件信息
+ */
+ @PostMapping("/upload")
+ public R upload(@RequestParam("file") MultipartFile file) {
+ return ossService.upload(file);
+ }
+
+ /**
+ * 多文件上传
+ *
+ * @param files 文件流数组
+ * @return 上传结果
+ */
+ @PostMapping("/uploadMultiple")
+ public R> uploadMultiple(@RequestParam("files") MultipartFile[] files) {
+ return ossService.uploadMultiple(files);
+ }
+
+ /**
+ * 文件下载
+ *
+ * @param ossFilePath oss文件存储地址
+ */
+ @GetMapping("/download")
+ public void download(HttpServletRequest request, HttpServletResponse response, @RequestParam String ossFilePath) {
+ try (OSSObject ossObject = ossService.download(ossFilePath)) {
+ if (ossObject == null) {
+ response.setStatus(HttpStatus.NOT_FOUND.value());
+ return;
+ }
+ InputStream inputStream = ossObject.getObjectContent();
+ String safeFileName = FileUtils.getFileNameFromPath(ossFilePath);
+ String encodedFileName = URLEncoder.encode(safeFileName, StandardCharsets.UTF_8.toString());
+ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+ response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"");
+ try (OutputStream outputStream = response.getOutputStream()) {
+ byte[] buffer = new byte[8192];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ outputStream.flush();
+ } catch (IOException e) {
+ response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+ }
+ } catch (IllegalArgumentException e) {
+ response.setStatus(HttpStatus.BAD_REQUEST.value());
+ } catch (Exception e) {
+ response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+ }
+ }
+
+
+ /**
+ * 文件删除
+ *
+ * @param ossFilePath 文件路径
+ * @return 删除结果
+ */
+ @PostMapping("/delete")
+ public R delete(@RequestParam String ossFilePath) {
+ return ossService.delete(ossFilePath);
+ }
+
+ /**
+ * 多文件删除
+ *
+ * @param ossFilePaths 文件路径列表
+ * @return 删除结果
+ */
+ @PostMapping("/deleteMultiple")
+ public R deleteMultiple(@RequestParam List ossFilePaths) {
+ return ossService.deleteMultiple(ossFilePaths);
+ }
+
+ /**
+ * 文件复制
+ *
+ * @param source 原oss文件存储地址
+ * @param path 目标oss文件存储地址
+ * @return 复制结果
+ */
+ @PostMapping("/copy")
+ public R copy(@RequestParam String source, @RequestParam String path) {
+ return ossService.copy(source, path);
+ }
+
+ /**
+ * 多文件复制
+ *
+ * @param sources 原oss文件存储地址列表
+ * @param paths 目标oss文件存储地址列表
+ * @return 复制结果
+ */
+ @PostMapping("/copyMultiple")
+ public R copyMultiple(@RequestParam List sources, @RequestParam List paths) {
+ return ossService.copyMultiple(sources, paths);
+ }
+}
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/domain/OssInfo.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/domain/OssInfo.java
new file mode 100644
index 0000000..c3f9511
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/domain/OssInfo.java
@@ -0,0 +1,72 @@
+package com.bonus.oss.domain;
+
+
+/**
+ * @author 陈敏
+ * @version Info.java, v 1.1 2021/11/15 10:16 chenmin Exp $
+ * Created on 2021/11/15
+ */
+
+public class OssInfo {
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * oss里的路径存储路径
+ */
+ private String path;
+ /**
+ * 对象大小
+ */
+ private String length;
+ /**
+ * 文件类型
+ */
+ private String fileType;
+ /**
+ * Bucket名称
+ **/
+ private String bucketName;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public String getLength() {
+ return length;
+ }
+
+ public void setLength(String length) {
+ this.length = length;
+ }
+
+
+ public String getFileType() {
+ return fileType;
+ }
+
+ public void setFileType(String fileType) {
+ this.fileType = fileType;
+ }
+
+ public String getBucketName() {
+ return bucketName;
+ }
+
+ public void setBucketName(String bucketName) {
+ this.bucketName = bucketName;
+ }
+}
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/service/OssService.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/service/OssService.java
new file mode 100644
index 0000000..8bd1e93
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/service/OssService.java
@@ -0,0 +1,71 @@
+package com.bonus.oss.service;
+
+import com.aliyun.oss.model.OSSObject;
+import com.bonus.common.core.domain.R;
+import com.bonus.oss.domain.OssInfo;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+public interface OssService {
+
+ /**
+ * 文件上传
+ *
+ * @param param 文件流
+ * @return 文件信息
+ */
+ R upload(MultipartFile param);
+
+ /**
+ * 文件下载
+ *
+ * @param ossFilePath oss文件存储地址
+ * @return OSSObject对象
+ */
+ OSSObject download(String ossFilePath);
+
+ /**
+ * 文件删除
+ *
+ * @param ossFilePath oss文件存储地址
+ * @return 操作结果
+ */
+ R delete(String ossFilePath);
+
+ /**
+ * 文件复制
+ *
+ * @param source 原oss文件存储地址
+ * @param path 目标oss文件存储地址
+ * @return 操作结果
+ */
+ R copy(String source, String path);
+
+ /**
+ * 多文件上传
+ *
+ * @param files 文件流数组
+ * @return 上传结果
+ */
+ R> uploadMultiple(MultipartFile[] files);
+
+
+ /**
+ * 多文件删除
+ *
+ * @param ossFilePaths oss文件存储地址列表
+ * @return 删除结果
+ */
+ R deleteMultiple(List ossFilePaths);
+
+ /**
+ * 多文件复制
+ *
+ * @param sources 源oss文件存储地址列表
+ * @param paths 目标oss文件存储地址列表
+ * @return 复制结果
+ */
+ R copyMultiple(List sources, List paths);
+}
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/service/impl/OssServiceImpl.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/service/impl/OssServiceImpl.java
new file mode 100644
index 0000000..ade0570
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/service/impl/OssServiceImpl.java
@@ -0,0 +1,137 @@
+package com.bonus.oss.service.impl;
+
+import com.aliyun.oss.model.OSSObject;
+import com.bonus.common.core.domain.R;
+import com.bonus.oss.domain.OssInfo;
+import com.bonus.oss.service.OssService;
+import com.bonus.oss.utils.FileUtils;
+import com.bonus.oss.utils.OssUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class OssServiceImpl implements OssService {
+
+ @Resource
+ private OssUtils ossUtils;
+
+ /**
+ * 文件上传
+ *
+ * @param file 文件流
+ * @return 文件信息
+ */
+ @Override
+ public R upload(MultipartFile file) {
+ try {
+ if (!FileUtils.isValidFile(file)) {
+ return R.fail("File is empty or File size exceeds 5GB!");
+ }
+ return ossUtils.upload(file);
+ } catch (Exception e) {
+ return R.fail("File upload failed.");
+ }
+ }
+
+ /**
+ * 文件下载
+ *
+ * @param ossFilePath oss文件存储地址
+ */
+ @Override
+ public OSSObject download(String ossFilePath) {
+ return ossUtils.download(ossFilePath);
+ }
+
+ /**
+ * 文件删除
+ *
+ * @param ossFilePath oss文件存储地址
+ */
+ @Override
+ public R delete(String ossFilePath) {
+ try {
+ if (ObjectUtils.isNotEmpty(ossFilePath)) {
+ return ossUtils.delete(ossFilePath);
+ } else {
+ return R.fail("ossFilePath is null.");
+ }
+ } catch (Exception e) {
+ return R.fail("File delete failed.");
+ }
+ }
+
+ /**
+ * 文件复制
+ *
+ * @param source 原oss文件存储地址target
+ * @param path 目标oss文件存储地址
+ */
+ @Override
+ public R copy(String source, String path) {
+ return ossUtils.copy(source, path);
+ }
+
+ /**
+ * 多文件上传
+ *
+ * @param files 文件流数组
+ * @return 上传结果
+ */
+ @Override
+ public R> uploadMultiple(MultipartFile[] files) {
+ List uploadedFilesInfo = new ArrayList<>();
+ for (MultipartFile file : files) {
+ R result = upload(file);
+ if (R.isError(result)) {
+ return R.fail("部分文件上传失败");
+ }
+ uploadedFilesInfo.add(result.getData());
+ }
+ return R.ok(uploadedFilesInfo);
+ }
+
+ /**
+ * 多文件删除
+ *
+ * @param ossFilePaths oss文件存储地址列表
+ * @return 删除结果
+ */
+ @Override
+ public R deleteMultiple(List ossFilePaths) {
+ for (String path : ossFilePaths) {
+ R result = delete(path);
+ if (R.isError(result)) {
+ return R.fail("部分文件删除失败");
+ }
+ }
+ return R.ok();
+ }
+
+ /**
+ * 多文件复制
+ *
+ * @param sources 源oss文件存储地址列表
+ * @param paths 目标oss文件存储地址列表
+ * @return 复制结果
+ */
+ @Override
+ public R copyMultiple(List sources, List paths) {
+ if (sources.size() != paths.size()) {
+ return R.fail("源文件和目标文件数量不匹配");
+ }
+ for (int i = 0; i < sources.size(); i++) {
+ R result = copy(sources.get(i), paths.get(i));
+ if (R.isError(result)) {
+ return R.fail("部分文件复制失败");
+ }
+ }
+ return R.ok();
+ }
+}
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/utils/FileUtils.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/utils/FileUtils.java
new file mode 100644
index 0000000..61c379f
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/utils/FileUtils.java
@@ -0,0 +1,85 @@
+package com.bonus.oss.utils;
+
+import com.bonus.common.core.utils.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class FileUtils {
+ /**
+ * 检查MultipartFile是否有效(不为空且大小不超过5GB)
+ *
+ * @param file MultipartFile对象
+ * @return 文件有效返回true,否则返回false
+ */
+ public static boolean isValidFile(MultipartFile file) {
+ if (file == null || file.isEmpty()) {
+ return false;
+ }
+ // 文件大小限制为5GB
+ long maxSizeInBytes = 5L * 1024 * 1024 * 1024;
+ return file.getSize() <= maxSizeInBytes;
+ }
+
+ /**
+ * 生成统一路径的objectName
+ *
+ * @param fileName 文件名
+ * @return 生成的objectName
+ */
+ public static String generateObjectName(String fileName) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
+ String datePath = sdf.format(new Date());
+ return "uploads/" + datePath + "/" + fileName;
+ }
+
+
+ public static boolean isValidOssFilePath(String ossFilePath) {
+ // 根据实际情况添加对ossFilePath的校验逻辑,确保其只包含安全的字符
+ return StringUtils.hasText(ossFilePath) && ossFilePath.matches("^[\\w\\d\\-\\_\\.]+$");
+ }
+
+ public static String sanitizeFileName(String fileName) {
+ // 避免文件名注入,移除或替换不安全的字符
+ return fileName.replaceAll("[^a-zA-Z0-9\\.\\-_]", "_");
+ }
+
+
+ /**
+ * 从文件路径中提取文件名
+ * @param ossFilePath 文件路径
+ * @return 文件名
+ */
+ public static String getFileNameFromPath(String ossFilePath) {
+ Path path = Paths.get(ossFilePath);
+ return path.getFileName().toString();
+ }
+
+
+ /**
+ * MultipartFile 转 File
+ *
+ * @param multiFile MultipartFile对象
+ * @return 转换后的File对象
+ */
+ public static File multipartFileToFile(MultipartFile multiFile) {
+ try {
+ String fileName = multiFile.getOriginalFilename();
+ if (fileName == null) {
+ return null;
+ }
+ String prefix = fileName.substring(0, fileName.lastIndexOf("."));
+ String suffix = fileName.substring(fileName.lastIndexOf("."));
+ File file = File.createTempFile(prefix, suffix);
+ multiFile.transferTo(file);
+ return file;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+}
diff --git a/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/utils/OssUtils.java b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/utils/OssUtils.java
new file mode 100644
index 0000000..52550b7
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/java/com/bonus/oss/utils/OssUtils.java
@@ -0,0 +1,181 @@
+package com.bonus.oss.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.bonus.common.core.domain.R;
+import com.bonus.common.core.text.Convert;
+import com.bonus.oss.config.OSSConfig;
+import com.bonus.oss.domain.OssInfo;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.io.File;
+
+/**
+ * OSS存储工具类
+ */
+@Service
+public class OssUtils {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OssUtils.class);
+
+ @Resource
+ private OSSConfig ossConfig;
+
+ /**
+ * oss 客户端
+ */
+ private OSS ossClient;
+
+ /**
+ * 初始化信息
+ * 构建OSS客户端实例
+ */
+ @PostConstruct
+ public void init() {
+ ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
+ }
+
+ /**
+ * 上传文件
+ *
+ * @param param MultipartFile对象
+ * @return 包含上传文件信息的R对象
+ */
+ public R upload(MultipartFile param) {
+ // 获取上传文件的原始文件名
+ String originalFilename = param.getOriginalFilename();
+ // 将MultipartFile转换为File
+ File file = FileUtils.multipartFileToFile(param);
+ try {
+ // 生成唯一的对象名
+ String objectName = FileUtils.generateObjectName(originalFilename);
+ // 上传文件到OSS
+ ossClient.putObject(ossConfig.getBucket(), objectName, file);
+ // 获取上传文件的信息并返回
+ return R.ok(getInfo(originalFilename, objectName));
+ } catch (Exception e) {
+ LOGGER.error("文件上传失败", e);
+ return R.fail("文件上传失败");
+ } finally {
+ // 删除临时文件
+ if (!file.delete()) {
+ LOGGER.warn("临时文件删除失败");
+ }
+ }
+ }
+
+ /**
+ * 获取文件信息
+ *
+ * @param filename 文件名
+ * @param ossFilePath 文件路径
+ * @return 包含文件信息的OssInfo对象
+ */
+ public OssInfo getInfo(String filename, String ossFilePath) {
+ try {
+ // 获取文件的元数据
+ ObjectMetadata objectMetadata = ossClient.getObjectMetadata(ossConfig.getBucket(), ossFilePath);
+ OssInfo ossInfo = new OssInfo();
+ // 设置文件信息
+ ossInfo.setLength(Convert.toStr(objectMetadata.getContentLength()));
+ ossInfo.setFileType(objectMetadata.getContentType());
+ ossInfo.setName(filename);
+ ossInfo.setBucketName(ossConfig.getBucket());
+ ossInfo.setPath(ossFilePath);
+ return ossInfo;
+ } catch (Exception e) {
+ LOGGER.error("获取文件信息失败", e);
+ return null;
+ }
+ }
+
+ /**
+ * 下载文件
+ *
+ * @param ossFilePath 文件路径
+ * @return OSSObject对象
+ */
+ public OSSObject download(String ossFilePath) {
+ if (ObjectUtils.isEmpty(ossFilePath)) {
+ return null;
+ }
+ if (!doesObjectExist(ossConfig.getBucket(), ossFilePath)) {
+ return null;
+ }
+ try {
+ // 从OSS下载文件
+ return ossClient.getObject(ossConfig.getBucket(), ossFilePath);
+ } catch (Exception e) {
+ LOGGER.error("文件下载失败", e);
+ return null;
+ }
+ }
+
+
+ /**
+ * 删除文件
+ *
+ * @param ossFilePath 文件路径
+ */
+ public R delete(String ossFilePath) {
+ try {
+ if (!doesObjectExist(ossConfig.getBucket(), ossFilePath)) {
+ return R.fail("文件不存在");
+ }
+ // 从OSS删除文件
+ ossClient.deleteObject(ossConfig.getBucket(), ossFilePath);
+ } catch (Exception e) {
+ LOGGER.error("文件删除失败", e);
+ return R.fail("文件删除失败");
+ }
+ return R.ok();
+ }
+
+
+ /**
+ * 复制文件
+ *
+ * @param source 源文件路径
+ * @param path 目标文件路径
+ */
+ public R copy(String source, String path) {
+ if (!doesObjectExist(ossConfig.getBucket(), source)) {
+ return R.fail("文件不存在");
+ }
+ try {
+ // 复制文件
+ ossClient.copyObject(ossConfig.getBucket(), source, ossConfig.getBucket(), path);
+ return R.ok();
+ } catch (Exception e) {
+ LOGGER.error("文件复制失败", e);
+ return R.fail("文件复制失败");
+ }
+ }
+
+
+ /**
+ * 判断文件是否存在
+ *
+ * @param bucketName Bucket名称
+ * @param objectName 不包含Bucket名称在内的Object完整路径
+ * @return 如果文件存在则返回true,否则返回false
+ */
+ private boolean doesObjectExist(String bucketName, String objectName) {
+ try {
+ // 判断文件是否存在
+ return ossClient.doesObjectExist(bucketName, objectName);
+ } catch (Exception e) {
+ LOGGER.error("判断文件是否存在失败", e);
+ return true;
+ }
+ }
+}
diff --git a/bonus-modules/bonus-oss/src/main/resources/banner.txt b/bonus-modules/bonus-oss/src/main/resources/banner.txt
new file mode 100644
index 0000000..b547ca4
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/resources/banner.txt
@@ -0,0 +1,8 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _
+ | |
+ | |__ ___ _ __ _ _ ___ ______ ___ ___ ___
+ | '_ \ / _ \ | '_ \ | | | | / __| |______| / _ \ / __| / __|
+ | |_) | | (_) | | | | | | |_| | \__ \ | (_) | \__ \ \__ \
+ |_.__/ \___/ |_| |_| \__,_| |___/ \___/ |___/ |___/
\ No newline at end of file
diff --git a/bonus-modules/bonus-oss/src/main/resources/bootstrap.yml b/bonus-modules/bonus-oss/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..eeca833
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/resources/bootstrap.yml
@@ -0,0 +1,29 @@
+# Tomcat
+server:
+ port: 9204
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: bonus-oss
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ username: nacos
+ password: nacos
+ discovery:
+ # 服务注册地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ config:
+ # 配置中心地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
diff --git a/bonus-modules/bonus-oss/src/main/resources/logback.xml b/bonus-modules/bonus-oss/src/main/resources/logback.xml
new file mode 100644
index 0000000..7607fdf
--- /dev/null
+++ b/bonus-modules/bonus-oss/src/main/resources/logback.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+ ${log.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bonus-modules/pom.xml b/bonus-modules/pom.xml
index 1d049d4..5f8c122 100644
--- a/bonus-modules/pom.xml
+++ b/bonus-modules/pom.xml
@@ -13,6 +13,7 @@
bonus-gen
bonus-job
bonus-file
+ bonus-oss
bonus-modules