dengsixing 1 неделя назад
Родитель
Сommit
42bdf03538
24 измененных файлов с 741 добавлено и 223 удалено
  1. 6 0
      pom.xml
  2. 12 0
      src/main/java/com/fdkankan/modeldemo/bean/TietaMinioResBean.java
  3. 28 0
      src/main/java/com/fdkankan/modeldemo/config/MinioProperties.java
  4. 19 0
      src/main/java/com/fdkankan/modeldemo/constant/StorageType.java
  5. 69 0
      src/main/java/com/fdkankan/modeldemo/constant/UploadFilePath.java
  6. 74 0
      src/main/java/com/fdkankan/modeldemo/entity/MinioBucket.java
  7. 9 0
      src/main/java/com/fdkankan/modeldemo/entity/SceneFileMapping.java
  8. 29 0
      src/main/java/com/fdkankan/modeldemo/httpclient/CustomHttpClient.java
  9. 18 0
      src/main/java/com/fdkankan/modeldemo/mapper/MinioBucketMapper.java
  10. 0 3
      src/main/java/com/fdkankan/modeldemo/mq/ConvertListener.java
  11. 7 4
      src/main/java/com/fdkankan/modeldemo/service/FYunFileService.java
  12. 16 0
      src/main/java/com/fdkankan/modeldemo/service/MinioBucketService.java
  13. 114 35
      src/main/java/com/fdkankan/modeldemo/service/impl/FYunFileServiceImpl.java
  14. 20 0
      src/main/java/com/fdkankan/modeldemo/service/impl/MinioBucketServiceImpl.java
  15. 7 35
      src/main/java/com/fdkankan/modeldemo/utils/ConvertUtil.java
  16. 28 0
      src/main/java/com/fdkankan/modeldemo/utils/ESAPIUtil.java
  17. 135 135
      src/main/java/com/fdkankan/modeldemo/utils/FdfsUtil.java
  18. 100 0
      src/main/java/com/fdkankan/modeldemo/utils/MinioUtil.java
  19. 11 2
      src/main/resources/application-dev.yml
  20. 11 4
      src/main/resources/application-preprod.yml
  21. 10 3
      src/main/resources/application-prod.yml
  22. 10 2
      src/main/resources/application-test.yml
  23. 3 0
      src/main/resources/application.yml
  24. 5 0
      src/main/resources/mapper/MinioBucketMapper.xml

+ 6 - 0
pom.xml

@@ -145,6 +145,12 @@
       <artifactId>freemarker</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>org.owasp.esapi</groupId>
+      <artifactId>esapi</artifactId>
+      <version>2.1.0.1</version>
+    </dependency>
+
   </dependencies>
 
   <build>

+ 12 - 0
src/main/java/com/fdkankan/modeldemo/bean/TietaMinioResBean.java

@@ -0,0 +1,12 @@
+package com.fdkankan.modeldemo.bean;
+
+import lombok.Data;
+
+@Data
+public class TietaMinioResBean<T> {
+
+    private String status;
+    private String desc;
+    private T data;
+
+}

+ 28 - 0
src/main/java/com/fdkankan/modeldemo/config/MinioProperties.java

@@ -0,0 +1,28 @@
+package com.fdkankan.modeldemo.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "minio")
+public class MinioProperties {
+
+    private String bucket;
+
+    private String address;
+
+    private Api api = new Api();
+
+    @Data
+    public static class Api{
+
+        private String upload;
+        private String preview;
+        private String removeObject;
+        private String download;
+
+    }
+
+}

+ 19 - 0
src/main/java/com/fdkankan/modeldemo/constant/StorageType.java

@@ -0,0 +1,19 @@
+package com.fdkankan.modeldemo.constant;
+
+public enum StorageType {
+
+    FDFS("fdfs"),
+    MINIO("minio");
+
+    private String code;
+
+    private StorageType(String code) {
+        this.code = code;
+    }
+
+    public String code() {
+        return code;
+    }
+
+
+}

+ 69 - 0
src/main/java/com/fdkankan/modeldemo/constant/UploadFilePath.java

@@ -0,0 +1,69 @@
+package com.fdkankan.modeldemo.constant;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class UploadFilePath {
+
+    public static final String BUCKET_NAME = "bucketName";
+
+    public static final String OBJECT_NAME = "objectName";
+
+    private UploadFilePath(){
+      log.info("初始化UploadFilePath.....");
+    }
+
+    /**
+     * oss.场景码目录
+     */
+    public static final String EDIT_PATH =  "scene_edit_data/%s/";
+    public static final String VIEW_PATH =  "scene_view_data/%s/";
+
+    public static final String USER_VIEW_PATH =  "scene_view_data/%s/user/";
+    /**
+     * 场景数据
+     */
+    public static final String DATA_EDIT_PATH =  "scene_edit_data/%s/data/";
+    public static final String DATA_VIEW_PATH =  "scene_view_data/%s/data/";
+    /**
+     * 场景图片
+     */
+    public static final String IMG_EDIT_PATH =  "scene_edit_data/%s/images/";
+    public static final String IMG_VIEW_PATH =  "scene_view_data/%s/images/";
+    /**
+     * 场景视频
+     */
+    public static final String VIDEOS_EDIT_PATH =  "scene_edit_data/%s/video/";
+    public static final String VIDEOS_VIEW_PATH =  "scene_view_data/%s/video/";
+
+    /**
+     * 场景音频
+     */
+    public static final String VOICE_EDIT_PATH =  "scene_edit_data/%s/voice/";
+    public static final String VOICE_VIEW_PATH =  "scene_view_data/%s/voice/";
+
+    public static final String SCENE_NUM_PATH = "scene/%s";
+    public static final String IMG_CACHES_PATH =  "scene/%s/caches/images/";
+    public static final String VIDEOS_CACHES_PATH =  "scene/%s/caches/videos/";
+
+    public static final String DOWNLOADS_QRCODE = "downloads/scene/%s/QRcode/";
+
+    public static final String DOWNLOADS_TOUR_VIDEO = "downloads/scene/%s/tour/";
+
+    /**
+     * 场景计算日志文件地址
+     */
+    public static final String BUILD_LOG_PATH = "build_log/%s/";
+
+    /**
+     * 管理后台文件路径
+     */
+    public static final String MANAGE_FILE_PATH = "manage/%s/%s";
+
+    /**
+     * 场景计算结果数据存放路径
+     */
+    public static final String scene_result_data_path = "scene_result_data/%s/";
+
+
+}

+ 74 - 0
src/main/java/com/fdkankan/modeldemo/entity/MinioBucket.java

@@ -0,0 +1,74 @@
+package com.fdkankan.modeldemo.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 桶基本信息
+ * </p>
+ *
+ * @author 
+ * @since 2025-11-19
+ */
+@Getter
+@Setter
+@TableName("t_minio_bucket")
+public class MinioBucket implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 桶名称
+     */
+    @TableField("bucket_name")
+    private String bucketName;
+
+    /**
+     * 创建时间
+     */
+    @TableField("creation_date")
+    private Date creationDate;
+
+    /**
+     * 容量大小
+     */
+    @TableField("size")
+    private Integer size;
+
+    /**
+     * 容量单位
+     */
+    private String quotaUnit;
+
+    /**
+     * 模块编码
+     */
+    @TableField("module_code")
+    private String moduleCode;
+
+    /**
+     * 模块名称
+     */
+    @TableField("module_name")
+    private String moduleName;
+
+    /**
+     * 删除标识(I无效;A有效)
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+
+}

+ 9 - 0
src/main/java/com/fdkankan/modeldemo/entity/SceneFileMapping.java

@@ -47,6 +47,15 @@ public class SceneFileMapping extends Model<SceneFileMapping> {
     @TableField("UP_TIME")
     private String upTime;
 
+    @TableField("bucket_name")
+    private String bucketName;
+
+    @TableField("object_name")
+    private String objectName;
+
+    @TableField("storage_type")
+    private String storageType;
+
 
 //    @Override
 //    protected Serializable pkVal() {

+ 29 - 0
src/main/java/com/fdkankan/modeldemo/httpclient/CustomHttpClient.java

@@ -0,0 +1,29 @@
+package com.fdkankan.modeldemo.httpclient;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.*;
+import com.dtflys.forest.extensions.DownloadFile;
+
+import java.io.InputStream;
+import java.util.Map;
+
+public interface CustomHttpClient {
+
+    @Post(url = "{url}", connectTimeout = 30000,  readTimeout = 30000, maxRetryInterval = 3)
+    JSONObject postJson(@Var("url") String url, @JSONBody Object object);
+
+    @Post(url = "{url}", connectTimeout = 30000,  readTimeout = 30000, maxRetryInterval = 3)
+    JSONObject post(@Header Map<String, String> headers, @Var("url") String url);
+
+    /**
+     * 返回类型用InputStream,用流的方式读取文件内容
+     */
+    @GetRequest(url = "{url}", connectTimeout = 6000, readTimeout = 60000, maxRetryInterval = 5)
+    InputStream downloadFileToInputStream(@Var("url") String url);
+
+    @GetRequest(url = "{url}", connectTimeout = 6000, readTimeout = 60000, maxRetryInterval = 5)
+    @DownloadFile(dir = "{dir}", filename = "{fileName}")
+    void downloadFile(@Var("url") String url, @Var("dir") String dir, @Var("fileName") String fileName);
+
+}

+ 18 - 0
src/main/java/com/fdkankan/modeldemo/mapper/MinioBucketMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.modeldemo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.modeldemo.entity.MinioBucket;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 桶基本信息 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2025-11-19
+ */
+@Mapper
+public interface MinioBucketMapper extends BaseMapper<MinioBucket> {
+
+}

+ 0 - 3
src/main/java/com/fdkankan/modeldemo/mq/ConvertListener.java

@@ -24,7 +24,6 @@ import com.fdkankan.modeldemo.service.SceneConvertLogService;
 import com.fdkankan.modeldemo.service.SceneFileMappingService;
 import com.fdkankan.modeldemo.service.SceneService;
 import com.fdkankan.modeldemo.utils.ConvertUtil;
-import com.fdkankan.modeldemo.utils.FdfsUtil;
 import com.fdkankan.modeldemo.utils.HttpUtilExt;
 import com.fdkankan.redis.RedisClient;
 import com.rabbitmq.client.Channel;
@@ -57,8 +56,6 @@ public class ConvertListener{
 
     @Autowired
     private ConvertUtil convertUtil;
-    @Resource
-    private FdfsUtil fdfsUtil;
     @Autowired
     private SceneFileMappingService sceneFileMappingService;
     @Autowired

+ 7 - 4
src/main/java/com/fdkankan/modeldemo/service/FYunFileService.java

@@ -1,17 +1,20 @@
 package com.fdkankan.modeldemo.service;
 
+import org.owasp.esapi.errors.EncodingException;
+import org.owasp.esapi.errors.ValidationException;
+
 import java.io.IOException;
 
 public interface FYunFileService {
 
-//    String getFileContent(String key, Integer subgroup, String upTime) throws IOException;
+    String getFileContent(String key, Integer subgroup, String upTime) throws IOException;
 
-    void uploadFile(String num, Integer subgroup, String upTime, byte[] data, String key);
+    void uploadFile(String num, Integer subgroup, String upTime, byte[] data, String key) throws ValidationException, EncodingException;
 
     void uploadFile(String num, Integer subgroup, String upTime, String path, String key);
 
-//    void deleteFile(String num, Integer subgroup, String upTime, String key);
+    void deleteFile(String num, Integer subgroup, String upTime, String key);
 
-//    String downloadFile(String num, Integer subgroup, String upTime, String key, String dir, String fileName);
+    String downloadFile(String num, Integer subgroup, String upTime, String key, String dir, String fileName);
 
 }

+ 16 - 0
src/main/java/com/fdkankan/modeldemo/service/MinioBucketService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.modeldemo.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.modeldemo.entity.MinioBucket;
+
+/**
+ * <p>
+ * 桶基本信息 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2025-11-19
+ */
+public interface MinioBucketService extends IService<MinioBucket> {
+
+}

+ 114 - 35
src/main/java/com/fdkankan/modeldemo/service/impl/FYunFileServiceImpl.java

@@ -1,17 +1,27 @@
 package com.fdkankan.modeldemo.service.impl;
 
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.StrUtil;
+import com.fdkankan.modeldemo.config.MinioProperties;
+import com.fdkankan.modeldemo.constant.StorageType;
+import com.fdkankan.modeldemo.constant.UploadFilePath;
 import com.fdkankan.modeldemo.entity.SceneFileMapping;
-import com.fdkankan.modeldemo.httpclient.HttpClient;
+import com.fdkankan.modeldemo.httpclient.CustomHttpClient;
 import com.fdkankan.modeldemo.service.FYunFileService;
 import com.fdkankan.modeldemo.service.SceneFileMappingService;
-import com.fdkankan.modeldemo.utils.FdfsUtil;
+import com.fdkankan.modeldemo.utils.ESAPIUtil;
+import com.fdkankan.modeldemo.utils.MinioUtil;
+import org.owasp.esapi.errors.EncodingException;
+import org.owasp.esapi.errors.ValidationException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import java.util.Objects;
@@ -22,61 +32,130 @@ public class FYunFileServiceImpl implements FYunFileService {
     @Autowired
     private SceneFileMappingService sceneFileMappingService;
     @Resource
-    private HttpClient customHttpClient;
+    private CustomHttpClient customHttpClient;
 
     @Resource
-    private FdfsUtil fdfsUtil;
+    private MinioProperties minioProperties;
+    @Resource
+    private MinioUtil minioUtil;
+
+
+    @Override
+    public String getFileContent(String key, Integer subgroup, String upTime) throws IOException {
+        SceneFileMapping sceneFileMapping = sceneFileMappingService.getByKey(key, subgroup, upTime);
+        if(Objects.isNull(sceneFileMapping)){
+            return null;
+        }
+        String content = null;
+        String url = null;
+        String storageType = sceneFileMapping.getStorageType();
+        if(StrUtil.isNotEmpty(storageType) && storageType.equals(StorageType.MINIO.code())){
+            url = minioProperties.getAddress().concat(minioProperties.getApi().getPreview().replace(UploadFilePath.BUCKET_NAME, sceneFileMapping.getBucketName()).replace(UploadFilePath.OBJECT_NAME, sceneFileMapping.getObjectName()));
+        }else{
+            url = sceneFileMapping.getUrl();
+        }
+        try (InputStream inputStream = customHttpClient.downloadFileToInputStream(url)){
+            content =  IoUtil.read(inputStream, StandardCharsets.UTF_8);
+        }
+        return content;
+    }
 
     @Override
-    public void uploadFile(String num, Integer subgroup, String upTime, byte[] data, String key) {
-        // 获取文件后缀
+    public void uploadFile(String num, Integer subgroup, String upTime, byte[] data, String key) throws ValidationException, EncodingException {
         String suffix = "." + FileUtil.getSuffix(key);
-        // 创建临时文件
-        File tempFile = FileUtil.createTempFile(UUID.fastUUID().toString(), suffix, new File("/temp"), true);
-        // 将数据写入临时文件
+        File tempFile = FileUtil.createTempFile(UUID.fastUUID().toString(), suffix, new File(ESAPIUtil.validFilePath(ESAPIUtil.getRealPath("temp"))), true);
         FileUtil.writeBytes(data, tempFile);
-        // 上传文件并获取映射信息
-        Map<String, String> mapping = fdfsUtil.uploadFile(tempFile.getAbsolutePath());
-        // 添加记录
-        SceneFileMapping sceneFileMapping =  sceneFileMappingService.getByKey(key, subgroup, upTime);
-        if(Objects.isNull(sceneFileMapping)){
-            sceneFileMapping = new SceneFileMapping();
+        try {
+            Map<String, String> uploadRes = minioUtil.upload(tempFile.getAbsolutePath());
+
+            //添加记录
+            SceneFileMapping sceneFileMapping =  sceneFileMappingService.getByKey(key, subgroup, upTime);
+            if(Objects.isNull(sceneFileMapping)){
+                sceneFileMapping = new SceneFileMapping();
+            }
+            sceneFileMapping.setNum(num);
+            sceneFileMapping.setKey(key);
+            sceneFileMapping.setSubgroup(subgroup);
+            sceneFileMapping.setUpTime(upTime);
+            sceneFileMapping.setStorageType(StorageType.MINIO.code());
+            sceneFileMapping.setBucketName(uploadRes.get(UploadFilePath.BUCKET_NAME));
+            sceneFileMapping.setObjectName(uploadRes.get(UploadFilePath.OBJECT_NAME));
+            sceneFileMappingService.saveOrUpdate(sceneFileMapping);
+        }catch (Exception e){
+            throw e;
+        }finally {
+            FileUtil.del(tempFile);
         }
-        sceneFileMapping.setNum(num);
-        sceneFileMapping.setFileid(mapping.get("file_id"));
-        sceneFileMapping.setUrl(mapping.get("http_url"));
-        sceneFileMapping.setKey(key);
-        sceneFileMapping.setSubgroup(subgroup);
-        sceneFileMapping.setUpTime(upTime);
-        // 保存或更新记录
-        sceneFileMappingService.saveOrUpdate(sceneFileMapping);
+
+
     }
 
     @Override
     public void uploadFile(String num, Integer subgroup, String upTime, String path, String key) {
-        // 上传文件并获取映射信息
-        Map<String, String> mapping = fdfsUtil.uploadFile(path);
-        // 添加记录
+        Map<String, String> uploadRes = minioUtil.upload(path, UUID.fastUUID() + "." + FileUtil.getSuffix(path));
+        //添加记录
         SceneFileMapping sceneFileMapping =  sceneFileMappingService.getByKey(key,subgroup,upTime);
         if(Objects.isNull(sceneFileMapping)){
             sceneFileMapping = new SceneFileMapping();
         }
         sceneFileMapping.setNum(num);
-        sceneFileMapping.setFileid(mapping.get("file_id"));
-        sceneFileMapping.setUrl(mapping.get("http_url"));
         sceneFileMapping.setKey(key);
         sceneFileMapping.setSubgroup(subgroup);
         sceneFileMapping.setUpTime(upTime);
-        // 保存或更新记录
+        sceneFileMapping.setStorageType(StorageType.MINIO.code());
+        sceneFileMapping.setBucketName(uploadRes.get(UploadFilePath.BUCKET_NAME));
+        sceneFileMapping.setObjectName(uploadRes.get(UploadFilePath.OBJECT_NAME));
         sceneFileMappingService.saveOrUpdate(sceneFileMapping);
     }
 
+    @Override
+    public void deleteFile(String num, Integer subgroup, String upTime, String key) {
+        SceneFileMapping sceneFileMapping =  sceneFileMappingService.getByKey(key,subgroup,upTime);
+        if(sceneFileMapping == null){
+            return;
+        }
+        if(StrUtil.isNotEmpty(sceneFileMapping.getStorageType())
+                && sceneFileMapping.getStorageType().equals(StorageType.MINIO.code())){
+            minioUtil.delete(sceneFileMapping.getBucketName(), sceneFileMapping.getObjectName());
+        }
+
+        sceneFileMappingService.removeById(sceneFileMapping.getId());
+    }
+
+    @Override
+    public String downloadFile(String num, Integer subgroup, String upTime, String key, String dir, String fileName) {
+        SceneFileMapping sceneFileMapping = sceneFileMappingService.getByKey(key, subgroup,upTime);
+        if(Objects.isNull(sceneFileMapping)){
+            return null;
+        }
+        String url = null;
+        if(StrUtil.isNotEmpty(sceneFileMapping.getStorageType())
+                && sceneFileMapping.getStorageType().equals(StorageType.MINIO.code())){
+            url = minioProperties.getAddress().concat(minioProperties.getApi().getDownload().replace(UploadFilePath.BUCKET_NAME, sceneFileMapping.getBucketName()).replace(UploadFilePath.OBJECT_NAME, sceneFileMapping.getObjectName()));
+        }else{
+            url =  sceneFileMapping.getUrl();
+        }
+        customHttpClient.downloadFile(url, dir, fileName);
+        if(dir.endsWith("/")){
+            dir += "/";
+        }
+        return dir + fileName;
+    }
+
+//    @Override
+//    public void uploadMulFiles(String num, Integer subgroup, String upTime, Map<String, String> map) {
+//        if(CollUtil.isEmpty(map)){
+//            return;
+//        }
+//        map.keySet().stream().forEach(localPath->{
+//            String  key = map.get(localPath);
+//            this.uploadFile(num, subgroup, upTime, localPath, key);
+//        });
+//
+//    }
+
     public static void main(String[] args) {
-        // 获取文件后缀
-        String suffix = "." + FileUtil.getSuffix("/sxx/ttt/adf.json");
-        // 创建临时文件
-        File tempFile = FileUtil.createTempFile(UUID.fastUUID().toString(), suffix, new File("D:\\test2"), true);
-        // 将字符串写入临时文件
-        FileUtil.writeBytes("nihsd灌灌灌灌".getBytes(StandardCharsets.UTF_8), tempFile);
+        String suffix = "." + FileUtil.getSuffix("sdf/sdfsdf.txt");
+        System.out.println(suffix);
     }
 }

+ 20 - 0
src/main/java/com/fdkankan/modeldemo/service/impl/MinioBucketServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.modeldemo.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.modeldemo.entity.MinioBucket;
+import com.fdkankan.modeldemo.mapper.MinioBucketMapper;
+import com.fdkankan.modeldemo.service.MinioBucketService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 桶基本信息 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2025-11-19
+ */
+@Service
+public class MinioBucketServiceImpl extends ServiceImpl<MinioBucketMapper, MinioBucket> implements MinioBucketService {
+
+}

+ 7 - 35
src/main/java/com/fdkankan/modeldemo/utils/ConvertUtil.java

@@ -14,12 +14,15 @@ import com.fdkankan.modeldemo.bean.SceneJsonBean;
 import com.fdkankan.modeldemo.bean.TagBean;
 import com.fdkankan.modeldemo.constant.Constant;
 import com.fdkankan.modeldemo.constant.RedisKey;
+import com.fdkankan.modeldemo.constant.StorageType;
 import com.fdkankan.modeldemo.entity.*;
 import com.fdkankan.modeldemo.service.*;
 import com.fdkankan.redis.RedisClient;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import lombok.extern.slf4j.Slf4j;
+import org.owasp.esapi.errors.EncodingException;
+import org.owasp.esapi.errors.ValidationException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -65,8 +68,6 @@ public class ConvertUtil {
     @Autowired
     private SceneFileMappingService sceneFileMappingService;
     @Resource
-    private FdfsUtil fdfsUtil;
-    @Resource
     private RedisClient redisClient;
     @Autowired
     private SceneEditInfoService sceneEditInfoService;
@@ -317,31 +318,10 @@ public class ConvertUtil {
                     List<String> deleteIds = sceneFileMappingList.stream().map(v -> v.getId()).collect(Collectors.toList());
                     sceneFileMappingService.removeByIds(deleteIds);
                 }
-                SceneFileMapping sceneFileMapping = new SceneFileMapping();
-                Map<String, String> mapping = fdfsUtil.uploadFile(map.get(key));
-                sceneFileMapping.setNum(finalRoomId);
-                sceneFileMapping.setFileid(mapping.get("file_id"));
-                sceneFileMapping.setUrl(mapping.get("http_url"));
-                sceneFileMapping.setKey(key);
-                sceneFileMapping.setSubgroup(subgroup);
-                sceneFileMapping.setUpTime(upTimeKey);
-                sceneFileMappingService.save(sceneFileMapping);
+                fYunFileService.uploadFile(finalRoomId, subgroup, upTimeKey, map.get(key), key);
             });
 
 
-//            List<Scene> list = sceneService.list(new LambdaQueryWrapper<Scene>().eq(Scene::getNum, num).eq(Scene::getSubgroup, subgroup).eq(Scene::getUpTimeKey, upTimeKey));
-//            Scene scene = null;
-//            if(CollUtil.isEmpty(list)){
-//                scene = new Scene();
-//            }else{
-//                if(list.size() > 1){
-//                    sceneService.remove(new LambdaQueryWrapper<Scene>().eq(Scene::getNum, num));
-//                    scene = new Scene();
-//                }else{
-//                    scene = list.get(0);
-//                }
-//            }
-
             Scene scene = new Scene();
             scene.setTitle(sceneBashInfo.getString(TITLE));
             scene.setNum(num);
@@ -383,7 +363,7 @@ public class ConvertUtil {
         return map;
     }
 
-    private void keepHot(Scene scene, SceneEditInfo sceneEditInfo){
+    private void keepHot(Scene scene, SceneEditInfo sceneEditInfo) throws ValidationException, EncodingException {
 
         String num = scene.getNum();
         String upTimeKey = scene.getUpTimeKey();
@@ -470,7 +450,7 @@ public class ConvertUtil {
         }
     }
 
-    private void publicHotData(Scene scene) {
+    private void publicHotData(Scene scene) throws ValidationException, EncodingException {
         String sceneNum = scene.getNum();
         Integer subgroup = scene.getSubgroup();
         String upTime  = scene.getUpTimeKey();
@@ -549,15 +529,7 @@ public class ConvertUtil {
             List<String> deleteIds = sceneFileMappingList.stream().map(v -> v.getId()).collect(Collectors.toList());
             sceneFileMappingService.removeByIds(deleteIds);
         }
-        SceneFileMapping sceneFileMapping = new SceneFileMapping();
-        Map<String, String> mapping = fdfsUtil.uploadFile(localVisionTxtPath);//sourcePath + "images/vision.txt"
-        sceneFileMapping.setNum(num);
-        sceneFileMapping.setFileid(mapping.get("file_id"));
-        sceneFileMapping.setUrl(mapping.get("http_url"));
-        sceneFileMapping.setKey(key);
-        sceneFileMapping.setSubgroup(-1);
-        sceneFileMapping.setUpTime(upTime);
-        sceneFileMappingService.save(sceneFileMapping);
+        fYunFileService.uploadFile(num, -1,upTime,localVisionTxtPath, key);
     }
 
     private SceneJsonBean genSceneJson(String roomId, String title, Integer subgroup){

+ 28 - 0
src/main/java/com/fdkankan/modeldemo/utils/ESAPIUtil.java

@@ -0,0 +1,28 @@
+package com.fdkankan.modeldemo.utils;
+
+import org.owasp.esapi.ESAPI;
+import org.owasp.esapi.codecs.MySQLCodec;
+import org.owasp.esapi.errors.EncodingException;
+import org.owasp.esapi.errors.ValidationException;
+
+import java.io.File;
+
+public class ESAPIUtil {
+
+    public static final String rootPath = "/app/4dkankan/";
+
+    public static String validFilePath(String inputPath, String rootPath) throws ValidationException, EncodingException {
+        return ESAPI.validator().getValidDirectoryPath(inputPath, inputPath, new File(rootPath), false);
+    }
+
+    public static String validFilePath(String inputPath) throws ValidationException, EncodingException {
+        return validFilePath(inputPath,rootPath);
+    }
+
+
+    public static String getRealPath(String dir){
+        return rootPath + dir;
+    }
+
+
+}

+ 135 - 135
src/main/java/com/fdkankan/modeldemo/utils/FdfsUtil.java

@@ -1,135 +1,135 @@
-package com.fdkankan.modeldemo.utils;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.UUID;
-import cn.hutool.http.HttpRequest;
-import cn.hutool.http.HttpResponse;
-import com.alibaba.fastjson.JSON;
-import com.fdkankan.modeldemo.bean.TietaResBean;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-@Component
-@Slf4j
-public class FdfsUtil {
-
-    private final static String TIMESTAMP_KEY = "timestamp";
-
-    private final static String NONCE_KEY = "nonce";
-
-    private final static String SYS_CODE_KEY = "sysCode";
-
-    private final static String FDFS_SUCCESS_CODE = "000000";
-
-    @Value("${fdfs.address}")
-    private String address;
-
-    @Value("${fdfs.api.getSignature}")
-    private String api_getSignature;
-
-    @Value("${fdfs.api.uploadFile}")
-    private String api_uploadFile;
-
-    @Value("${fdfs.sysCode}")
-    private String sysCode;
-
-    /**
-     * 获取签名
-     * @param nonce
-     * @param timestamp
-     * @return
-     */
-    public String getSignature(String nonce, String timestamp){
-        Map<String, String> headers = new HashMap<>();
-        headers.put(TIMESTAMP_KEY, timestamp);
-        headers.put(NONCE_KEY, nonce);
-        headers.put(SYS_CODE_KEY, sysCode);
-        //发送请求
-        HttpRequest httpRequest = HttpRequest.post(address.concat(api_getSignature)).addHeaders(headers).timeout(5000);
-        HttpResponse res = httpRequest.execute();
-        String resBody = res.body();
-        //关闭流
-        res.close();
-        //请求结果转换为bean对象
-        TietaResBean<String> tietaResBean = JSON.parseObject(resBody, TietaResBean.class);
-        String code = tietaResBean.getCode();
-        //状态吗错误,抛出异常
-        if(!FDFS_SUCCESS_CODE.equals(code)){
-            throw new RuntimeException("获取签名失败, code:" + code);
-        }
-        return tietaResBean.getData();
-    }
-
-    /**
-     * 上传文件
-     * @param nonce
-     * @param timestamp
-     * @param signature
-     * @param filePath
-     * @return
-     */
-    public Map<String, String> uploadFile(String nonce, String timestamp, String signature, String filePath){
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put(TIMESTAMP_KEY, timestamp);
-        headers.put(NONCE_KEY, nonce);
-        headers.put(SYS_CODE_KEY, sysCode);
-        headers.put("signature", signature);
-
-        Map<String, Object> test = new HashMap<>();
-        test.put("visibilityLevel", "1003");
-        test.put("file", new File(filePath));
-        test.put("userId", "111111");
-        //发送上传请求
-        HttpRequest httpRequest = HttpRequest.post(address.concat(api_uploadFile)).form(test).addHeaders(headers).timeout(120000);
-        HttpResponse res = httpRequest.execute();
-        String resBody = res.body();
-        log.info("upload file response : {}", resBody);
-        res.close();
-        //str转对象
-        TietaResBean<Map<String, String>> tietaResBean = JSON.parseObject(resBody, TietaResBean.class);
-        String code = tietaResBean.getCode();
-        if(!FDFS_SUCCESS_CODE.equals(code)){
-            //上传失败,抛出异常
-            throw new RuntimeException("上传文件失败, code:" + code);
-        }
-        return tietaResBean.getData();
-    }
-
-    /**
-     * 上传文件,其中包括获取签名以及上传文件两步
-     * @param filePath
-     * @return
-     */
-    public Map<String, String> uploadFile(String filePath){
-        String nonce = UUID.fastUUID().toString();
-        String timestamp = String.valueOf(new Date().getTime());
-        //请求获取签名
-        String signature = getSignature(nonce, timestamp);
-        Map<String, String> stringStringMap = null;
-        //上传文件,失败后重试4次
-        for(int i = 0; i< 5; i++){
-            try {
-                stringStringMap = uploadFile(nonce, timestamp, signature, filePath);
-                if(CollUtil.isNotEmpty(stringStringMap)){
-                    break;
-                }
-            }catch (Exception e){
-                log.warn("第{}上传文件失败,path:{}", i + 1, filePath, e);
-            }
-        }
-        if(CollUtil.isEmpty(stringStringMap)){
-            throw new RuntimeException("上传文件FASTDFS失败,path:{}" + filePath);
-        }
-        return stringStringMap;
-    }
-
-
-
-}
+//package com.fdkankan.modeldemo.utils;
+//
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.lang.UUID;
+//import cn.hutool.http.HttpRequest;
+//import cn.hutool.http.HttpResponse;
+//import com.alibaba.fastjson.JSON;
+//import com.fdkankan.modeldemo.bean.TietaResBean;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+//import java.io.File;
+//import java.util.Date;
+//import java.util.HashMap;
+//import java.util.Map;
+//
+//@Component
+//@Slf4j
+//public class FdfsUtil {
+//
+//    private final static String TIMESTAMP_KEY = "timestamp";
+//
+//    private final static String NONCE_KEY = "nonce";
+//
+//    private final static String SYS_CODE_KEY = "sysCode";
+//
+//    private final static String FDFS_SUCCESS_CODE = "000000";
+//
+//    @Value("${fdfs.address}")
+//    private String address;
+//
+//    @Value("${fdfs.api.getSignature}")
+//    private String api_getSignature;
+//
+//    @Value("${fdfs.api.uploadFile}")
+//    private String api_uploadFile;
+//
+//    @Value("${fdfs.sysCode}")
+//    private String sysCode;
+//
+//    /**
+//     * 获取签名
+//     * @param nonce
+//     * @param timestamp
+//     * @return
+//     */
+//    public String getSignature(String nonce, String timestamp){
+//        Map<String, String> headers = new HashMap<>();
+//        headers.put(TIMESTAMP_KEY, timestamp);
+//        headers.put(NONCE_KEY, nonce);
+//        headers.put(SYS_CODE_KEY, sysCode);
+//        //发送请求
+//        HttpRequest httpRequest = HttpRequest.post(address.concat(api_getSignature)).addHeaders(headers).timeout(5000);
+//        HttpResponse res = httpRequest.execute();
+//        String resBody = res.body();
+//        //关闭流
+//        res.close();
+//        //请求结果转换为bean对象
+//        TietaResBean<String> tietaResBean = JSON.parseObject(resBody, TietaResBean.class);
+//        String code = tietaResBean.getCode();
+//        //状态吗错误,抛出异常
+//        if(!FDFS_SUCCESS_CODE.equals(code)){
+//            throw new RuntimeException("获取签名失败, code:" + code);
+//        }
+//        return tietaResBean.getData();
+//    }
+//
+////    /**
+////     * 上传文件
+////     * @param nonce
+////     * @param timestamp
+////     * @param signature
+////     * @param filePath
+////     * @return
+////     */
+////    public Map<String, String> uploadFile(String nonce, String timestamp, String signature, String filePath){
+////
+////        Map<String, String> headers = new HashMap<>();
+////        headers.put(TIMESTAMP_KEY, timestamp);
+////        headers.put(NONCE_KEY, nonce);
+////        headers.put(SYS_CODE_KEY, sysCode);
+////        headers.put("signature", signature);
+////
+////        Map<String, Object> test = new HashMap<>();
+////        test.put("visibilityLevel", "1003");
+////        test.put("file", new File(filePath));
+////        test.put("userId", "111111");
+////        //发送上传请求
+////        HttpRequest httpRequest = HttpRequest.post(address.concat(api_uploadFile)).form(test).addHeaders(headers).timeout(120000);
+////        HttpResponse res = httpRequest.execute();
+////        String resBody = res.body();
+////        log.info("upload file response : {}", resBody);
+////        res.close();
+////        //str转对象
+////        TietaResBean<Map<String, String>> tietaResBean = JSON.parseObject(resBody, TietaResBean.class);
+////        String code = tietaResBean.getCode();
+////        if(!FDFS_SUCCESS_CODE.equals(code)){
+////            //上传失败,抛出异常
+////            throw new RuntimeException("上传文件失败, code:" + code);
+////        }
+////        return tietaResBean.getData();
+////    }
+//
+////    /**
+////     * 上传文件,其中包括获取签名以及上传文件两步
+////     * @param filePath
+////     * @return
+////     */
+////    public Map<String, String> uploadFile(String filePath){
+////        String nonce = UUID.fastUUID().toString();
+////        String timestamp = String.valueOf(new Date().getTime());
+////        //请求获取签名
+////        String signature = getSignature(nonce, timestamp);
+////        Map<String, String> stringStringMap = null;
+////        //上传文件,失败后重试4次
+////        for(int i = 0; i< 5; i++){
+////            try {
+////                stringStringMap = uploadFile(nonce, timestamp, signature, filePath);
+////                if(CollUtil.isNotEmpty(stringStringMap)){
+////                    break;
+////                }
+////            }catch (Exception e){
+////                log.warn("第{}上传文件失败,path:{}", i + 1, filePath, e);
+////            }
+////        }
+////        if(CollUtil.isEmpty(stringStringMap)){
+////            throw new RuntimeException("上传文件FASTDFS失败,path:{}" + filePath);
+////        }
+////        return stringStringMap;
+////    }
+//
+//
+//
+//}

+ 100 - 0
src/main/java/com/fdkankan/modeldemo/utils/MinioUtil.java

@@ -0,0 +1,100 @@
+package com.fdkankan.modeldemo.utils;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.modeldemo.constant.UploadFilePath;
+import com.fdkankan.modeldemo.service.MinioBucketService;
+import com.fdkankan.modeldemo.bean.TietaMinioResBean;
+import com.fdkankan.modeldemo.config.MinioProperties;
+import com.fdkankan.modeldemo.entity.MinioBucket;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class MinioUtil {
+
+    private final static String success_status = "SUCCESS";
+
+    @Autowired
+    private MinioBucketService minioBucketService;
+    @Resource
+    private MinioProperties minioProperties;
+
+    public Map<String, String> upload(String localPath){
+        return this.upload(localPath, null, null);
+    }
+
+    public Map<String, String> upload(String localPath, String objectName){
+        return this.upload(localPath, null, objectName);
+    }
+
+    public Map<String, String>  upload(String localPath, String bucketName, String objectName){
+        if(StrUtil.isEmpty(bucketName)){
+            MinioBucket bucket = minioBucketService.getOne(null);
+            bucketName = bucket.getBucketName();
+        }
+        if(StrUtil.isEmpty(objectName)){
+            objectName = FileUtil.getName(localPath);
+        }
+        HttpRequest httpRequest = HttpRequest.post(minioProperties.getAddress().concat(minioProperties.getApi().getUpload()))
+//                .header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
+                .form("file", new File(localPath), objectName)
+                .form(UploadFilePath.BUCKET_NAME, bucketName);
+        try (HttpResponse res = httpRequest.execute();){
+            String resBody = res.body();
+            TietaMinioResBean<String> tietaResBean = JSON.parseObject(resBody, TietaMinioResBean.class);
+            String code = tietaResBean.getStatus();
+            if(!success_status.equals(code)){
+                throw new RuntimeException("minio上传文件接口失败, code:" + code);
+            }
+        }
+
+        Map<String, String> result = new HashMap<>();
+        result.put(UploadFilePath.BUCKET_NAME, bucketName);
+        result.put(UploadFilePath.OBJECT_NAME, objectName);
+        return result;
+    }
+
+    public void delete(String bucketName, String objectName){
+        HttpRequest httpRequest = HttpRequest.delete(minioProperties.getAddress().concat(minioProperties.getApi().getRemoveObject()))
+                .form(UploadFilePath.BUCKET_NAME, bucketName).form(UploadFilePath.OBJECT_NAME, objectName);
+        try (HttpResponse res = httpRequest.execute()){
+            String resBody = res.body();
+            TietaMinioResBean<String> tietaResBean = JSON.parseObject(resBody, TietaMinioResBean.class);
+            String code = tietaResBean.getStatus();
+            if(!success_status.equals(code)){
+                throw new RuntimeException("minio删除文件接口失败, code:" + code);
+            }
+        }catch (Exception e){
+            log.error("删除minio文件失败,bucketName:{}, objectName:{}", bucketName, objectName, e);
+        }
+    }
+
+    public void download(String bucketName, String objectName){
+        HttpRequest httpRequest = HttpRequest.delete(minioProperties.getAddress().concat(minioProperties.getApi().getRemoveObject()))
+                .form(UploadFilePath.BUCKET_NAME, bucketName).form(UploadFilePath.OBJECT_NAME, objectName);
+        try (HttpResponse res = httpRequest.execute()){
+            String resBody = res.body();
+            TietaMinioResBean<String> tietaResBean = JSON.parseObject(resBody, TietaMinioResBean.class);
+            String code = tietaResBean.getStatus();
+            if(!success_status.equals(code)){
+                throw new RuntimeException("minio删除文件接口失败, code:" + code);
+            }
+        }catch (Exception e){
+            log.error("删除minio文件失败,bucketName:{}, objectName:{}", bucketName, objectName, e);
+        }
+    }
+
+
+
+}

+ 11 - 2
src/main/resources/application-dev.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: 4dkankan-center-convert
   rabbitmq:
-    host: 10.180.22.49
+    host: 10.180.22.152
     port: 5672
     username: User_CHNTZCGL_ZCSZHGL_003
     password: zcszhgl03_vr
@@ -47,7 +47,16 @@ fdfs:
     uploadFile: /ChinatowerFileService/uploadFile/
 
 redis:
-  host: http://10.180.22.54:8081
+  host: http://10.180.22.137:8081
+
+minio:
+  bucket: chntzcgl-zcszhgl-003-1
+  address: http://10.180.22.147:8511
+  api:
+    upload: /nodb/ChinatowerFile/upload
+    preview: /nodb/ChinatowerFile/preview/bucketName/objectName
+    removeObject: /nodb/ChinatowerFile/removeObject
+    download: /nodb/ChinatowerFile/download/bucketName/objectName
 
 
 

+ 11 - 4
src/main/resources/application-preprod.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: 4dkankan-center-convert
   rabbitmq:
-    host: 10.34.53.30
+    host: 10.198.13.5
     port: 5672
     username: User_CHNTZCGL_ZCSZHGL_003
     password: zcszhgl03_vr
@@ -16,7 +16,7 @@ spring:
     #开启消息投递确认机制
     publisher-confirm-type: correlated
   datasource:
-    url: jdbc:postgresql://10.161.32.224:5432/chinatower_vr
+    url: jdbc:postgresql://10.199.63.114:5432/chinatower_vr
     username: res_vr
     password: Qwer!@#123
     driver-class-name: org.postgresql.Driver
@@ -47,9 +47,16 @@ fdfs:
     uploadFile: /ChinatowerFileService/uploadFile/
 
 redis:
-  host: http://10.34.53.34:8081
-
+  host: http://10.198.13.203:18080
 
+minio:
+  bucket: chntzcgl-zcszhgl-003-1
+  address: http://10.198.13.31:8894
+  api:
+    upload: /nodb/ChinatowerFile/upload
+    preview: /nodb/ChinatowerFile/preview/bucketName/objectName
+    removeObject: /nodb/ChinatowerFile/removeObject
+    download: /nodb/ChinatowerFile/download/bucketName/objectName
 
 
 

+ 10 - 3
src/main/resources/application-prod.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: 4dkankan-center-convert
   rabbitmq:
-    host: 192.168.53.58
+    host: 10.159.83.185
     port: 5672
     username: User_CHNTZCGL_ZCSZHGL_003
     password: zcszhgl03_vr
@@ -47,9 +47,16 @@ fdfs:
     uploadFile: /ChinatowerFileService/uploadFile/
 
 redis:
-  host: http://192.168.53.243:8081
-
+  host: http://10.159.83.5:18080
 
+minio:
+  bucket: chntzcgl-zcszhgl-003-1
+  address: http://10.159.82.54:8894
+  api:
+    upload: /nodb/ChinatowerFile/upload
+    preview: /nodb/ChinatowerFile/preview/bucketName/objectName
+    removeObject: /nodb/ChinatowerFile/removeObject
+    download: /nodb/ChinatowerFile/download/bucketName/objectName
 
 
 

+ 10 - 2
src/main/resources/application-test.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: 4dkankan-center-convert
   rabbitmq:
-    host: 10.190.22.110
+    host: 10.190.22.133
     port: 5672
     username: User_CHNTZCGL_ZCSZHGL_003
     password: zcszhgl03_vr
@@ -47,8 +47,16 @@ fdfs:
     uploadFile: /ChinatowerFileService/uploadFile/
 
 redis:
-  host: http://10.190.22.99:8081
+  host: http://10.190.22.127:8081
 
+minio:
+  bucket: chntzcgl-zcszhgl-003-1
+  address: http://10.190.80.19:8511
+  api:
+    upload: /nodb/ChinatowerFile/upload
+    preview: /nodb/ChinatowerFile/preview/bucketName/objectName
+    removeObject: /nodb/ChinatowerFile/removeObject
+    download: /nodb/ChinatowerFile/download/bucketName/objectName
 
 
 

+ 3 - 0
src/main/resources/application.yml

@@ -1,2 +1,5 @@
 server:
   port: 10083
+spring:
+  profiles:
+    active: dev

+ 5 - 0
src/main/resources/mapper/MinioBucketMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.modeldemo.mapper.MinioBucketMapper">
+
+</mapper>