浏览代码

Merge remote-tracking branch 'origin/master' into master

zxf 3 天之前
父节点
当前提交
a3a5042020

+ 83 - 0
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/config/OBSConfig.java

@@ -0,0 +1,83 @@
+package com.ruoyi.file.config;
+
+import com.obs.services.ObsClient;
+import io.minio.MinioClient;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * OBS 配置信息
+ *
+ * @author lydgt
+ */
+@Configuration
+@ConfigurationProperties(prefix = "obs")
+public class OBSConfig
+{
+    /**
+     * 服务地址
+     */
+    private String url;
+
+    /**
+     * 用户名
+     */
+    private String accessKey;
+
+    /**
+     * 密码
+     */
+    private String secretKey;
+
+    /**
+     * 存储桶名称
+     */
+    private String bucketName;
+
+    public String getUrl()
+    {
+        return url;
+    }
+
+    public void setUrl(String url)
+    {
+        this.url = url;
+    }
+
+    public String getAccessKey()
+    {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey)
+    {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey()
+    {
+        return secretKey;
+    }
+
+    public void setSecretKey(String secretKey)
+    {
+        this.secretKey = secretKey;
+    }
+
+    public String getBucketName()
+    {
+        return bucketName;
+    }
+
+    public void setBucketName(String bucketName)
+    {
+        this.bucketName = bucketName;
+    }
+
+    @Bean
+    public ObsClient getObsClient()
+    {
+        return new ObsClient(accessKey, secretKey, url);
+    }
+}

+ 15 - 0
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/constant/RedisCacheConstants.java

@@ -0,0 +1,15 @@
+package com.ruoyi.file.constant;
+
+/**
+ * Redis缓存常量
+ * 
+ * @author lydgt
+ * @date 2026-02-04
+ */
+public class RedisCacheConstants {
+
+    /**
+     * 轮播图缓存key
+     */
+    public static final String LOGISTICS_BANNER_CACHE = "logistics:banner:";
+}

+ 12 - 4
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/controller/SysFileController.java

@@ -1,15 +1,17 @@
 package com.ruoyi.file.controller;
 
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.file.FileUtils;
+import com.ruoyi.file.service.ISysFileService;
+import com.ruoyi.system.api.domain.SysFile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.utils.file.FileUtils;
-import com.ruoyi.file.service.ISysFileService;
-import com.ruoyi.system.api.domain.SysFile;
 
 /**
  * 文件请求处理
@@ -45,4 +47,10 @@ public class SysFileController
             return R.fail(e.getMessage());
         }
     }
+
+    @GetMapping("download")
+    public R<String> download(@RequestParam("fileName") String fileName) {
+        String base64Data = sysFileService.getObsFile(fileName);
+        return R.ok(base64Data);
+    }
 }

+ 6 - 0
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java

@@ -2,6 +2,7 @@ package com.ruoyi.file.service;
 
 import java.io.InputStream;
 import com.alibaba.nacos.common.utils.IoUtils;
+import com.obs.services.model.ObsObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -53,4 +54,9 @@ public class FastDfsSysFileServiceImpl implements ISysFileService
             IoUtils.closeQuietly(inputStream);
         }
     }
+
+    @Override
+    public String getObsFile(String fileName) {
+        return null;
+    }
 }

+ 9 - 0
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/service/ISysFileService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.file.service;
 
+import com.obs.services.model.ObsObject;
 import org.springframework.web.multipart.MultipartFile;
 
 /**
@@ -17,4 +18,12 @@ public interface ISysFileService
      * @throws Exception
      */
     public String uploadFile(MultipartFile file) throws Exception;
+
+    /**
+     * 获取文件
+     *
+     * @param fileName 文件名称
+     * @return  文件
+     */
+    public String getObsFile(String fileName);
 }

+ 6 - 1
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ruoyi.file.service;
 
+import com.obs.services.model.ObsObject;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
@@ -11,7 +12,6 @@ import com.ruoyi.file.utils.FileUploadUtils;
  * 
  * @author lydgt
  */
-@Primary
 @Service
 public class LocalSysFileServiceImpl implements ISysFileService
 {
@@ -47,4 +47,9 @@ public class LocalSysFileServiceImpl implements ISysFileService
         String url = domain + localFilePrefix + name;
         return url;
     }
+
+    @Override
+    public String getObsFile(String fileName) {
+        return null;
+    }
 }

+ 7 - 0
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java

@@ -1,6 +1,8 @@
 package com.ruoyi.file.service;
 
 import java.io.InputStream;
+
+import com.obs.services.model.ObsObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -57,4 +59,9 @@ public class MinioSysFileServiceImpl implements ISysFileService
             IoUtils.closeQuietly(inputStream);
         }
     }
+
+    @Override
+    public String getObsFile(String fileName) {
+        return null;
+    }
 }

+ 80 - 0
jd-logistics-modules/jd-logistics-file/src/main/java/com/ruoyi/file/service/OBSSysFileServiceImpl.java

@@ -0,0 +1,80 @@
+package com.ruoyi.file.service;
+
+import com.alibaba.nacos.common.utils.IoUtils;
+import com.obs.services.ObsClient;
+import com.obs.services.model.ObsObject;
+import com.obs.services.model.PutObjectResult;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.file.config.MinioConfig;
+import com.ruoyi.file.config.OBSConfig;
+import com.ruoyi.file.constant.RedisCacheConstants;
+import com.ruoyi.file.utils.FileUploadUtils;
+import io.minio.MinioClient;
+import io.minio.PutObjectArgs;
+import org.apache.poi.util.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
+import java.util.Base64;
+
+/**
+ * Minio 文件存储
+ *
+ * @author lydgt
+ */
+@Primary
+@Service
+public class OBSSysFileServiceImpl implements ISysFileService
+{
+    @Autowired
+    private OBSConfig obsConfig;
+
+    @Autowired
+    private RedisService redisService;
+
+    /**
+     * Minio文件上传接口
+     *
+     * @param file 上传的文件
+     * @return 访问地址
+     * @throws Exception
+     */
+    @Override
+    public String uploadFile(MultipartFile file) throws Exception {
+        InputStream inputStream = null;
+        try {
+            String fileName = FileUploadUtils.extractFilename(file);
+            inputStream = file.getInputStream();
+
+            PutObjectResult putObjectResult = obsConfig.getObsClient().putObject(obsConfig.getBucketName(), fileName, inputStream);
+            return putObjectResult.getObjectUrl();
+        } catch (Exception e) {
+            throw new RuntimeException("Obs Failed to upload file", e);
+        } finally {
+            IoUtils.closeQuietly(inputStream);
+        }
+    }
+
+    @Override
+    public String getObsFile(String fileName) {
+        String key = RedisCacheConstants.LOGISTICS_BANNER_CACHE + fileName;
+        if (redisService.hasKey(key)) {
+            return redisService.getCacheObject(key);
+        }
+        try {
+            ObsObject object = obsConfig.getObsClient().getObject(obsConfig.getBucketName(), fileName);
+            byte[] byteArray = IOUtils.toByteArray(object.getObjectContent());
+            String base64String = Base64.getEncoder().encodeToString(byteArray);
+            String contentType = object.getMetadata().getContentType();
+            String base64Data = "data:" + contentType + ";base64," + base64String;
+            redisService.setCacheObject(key, base64Data);
+            return base64Data;
+        } catch (Exception e) {
+            throw new RuntimeException("Obs Failed to get file", e);
+        }
+    }
+}