Prechádzať zdrojové kódy

os文件管理 兼容本地文件上传

wanggaokun 1 rok pred
rodič
commit
e3419cc2e1

+ 23 - 3
km-admin/src/main/java/com/km/web/controller/common/CommonController.java

@@ -1,5 +1,6 @@
 package com.km.web.controller.common;
 
+import cn.hutool.core.util.IdUtil;
 import com.km.common.core.config.KmConfig;
 import com.km.common.core.constant.Constants;
 import com.km.common.core.core.domain.CommonResult;
@@ -7,6 +8,9 @@ import com.km.common.core.utils.StringUtils;
 import com.km.common.core.utils.file.FileUploadUtils;
 import com.km.common.core.utils.file.FileUtils;
 import com.km.system.config.ServerConfig;
+import com.km.system.domain.vo.SysOssUploadVo;
+import com.km.system.domain.vo.SysOssVo;
+import com.km.system.service.ISysOssService;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
@@ -37,6 +41,12 @@ public class CommonController {
     @Autowired
     private ServerConfig serverConfig;
 
+    private final ISysOssService sysOssService;
+
+    public CommonController(ISysOssService sysOssService) {
+        this.sysOssService = sysOssService;
+    }
+
     /**
      * 通用下载请求
      *
@@ -67,19 +77,29 @@ public class CommonController {
      * 通用上传请求(单个)
      */
     @PostMapping("/upload")
-    public CommonResult<Map<String, Object>> uploadFile(MultipartFile file) throws Exception {
+    public CommonResult<SysOssUploadVo> uploadFile(MultipartFile file) throws Exception {
         try {
+
             // 上传文件路径
             String filePath = KmConfig.getUploadPath();
             // 上传并返回新文件名称
             String fileName = FileUploadUtils.upload(filePath, file);
             String url = serverConfig.getUrl() + fileName;
+            String  originalFilename = file.getOriginalFilename();
             Map<String, Object> map = new HashMap<>();
             map.put("url", url);
             map.put("fileName", fileName);
             map.put("newFileName", FileUtils.getName(fileName));
-            map.put("originalFilename", file.getOriginalFilename());
-            return CommonResult.success(map);
+            map.put("originalFilename", originalFilename);
+            assert originalFilename != null;
+            String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length());
+            // 信息保存在文件管理
+            SysOssVo oss = sysOssService.saveResultEntity(file.getOriginalFilename(),suffix, url,fileName);
+            SysOssUploadVo uploadVo = new SysOssUploadVo();
+            uploadVo.setUrl(oss.getUrl());
+            uploadVo.setFileName(oss.getOriginalName());
+            uploadVo.setOssId(oss.getOssId().toString());
+            return CommonResult.success(uploadVo);
         } catch (Exception e) {
             return CommonResult.fail(e.getMessage());
         }

+ 3 - 3
km-common/km-common-core/src/main/java/com/km/common/core/utils/file/FileUploadUtils.java

@@ -169,9 +169,9 @@ public class FileUploadUtils {
     /**
      * 判断MIME类型是否是允许的MIME类型
      *
-     * @param extension
-     * @param allowedExtension
-     * @return
+     * @param extension extension
+     * @param allowedExtension allowedExtension
+     * @return res
      */
     public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {
         for (String str : allowedExtension) {

+ 1 - 2
km-common/km-common-core/src/main/java/com/km/common/core/utils/file/FileUtils.java

@@ -248,7 +248,6 @@ public class FileUtils extends FileUtil {
         if (fileName == null) {
             return null;
         }
-        String baseName = FilenameUtils.getBaseName(fileName);
-        return baseName;
+        return FilenameUtils.getBaseName(fileName);
     }
 }

+ 5 - 0
km-common/km-common-web/src/main/java/com/km/common/web/config/ResourcesConfig.java

@@ -1,5 +1,7 @@
 package com.km.common.web.config;
 
+import com.km.common.core.config.KmConfig;
+import com.km.common.core.constant.Constants;
 import com.km.common.web.interceptor.FlexWebInvokeTimeInterceptor;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.context.annotation.Bean;
@@ -26,8 +28,11 @@ public class ResourcesConfig implements WebMvcConfigurer {
 
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
+            .addResourceLocations("file:" + KmConfig.getProfile() + "/");
     }
 
+
     /**
      * 跨域配置
      */

+ 1 - 1
km-modules/km-system/src/main/java/com/km/system/service/ISysOssService.java

@@ -33,5 +33,5 @@ public interface ISysOssService extends IBaseService<SysOss> {
     void download(Long ossId, HttpServletResponse response) throws IOException;
 
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-
+    SysOssVo saveResultEntity(String originalFileName, String suffix, String url, String fileName);
 }

+ 43 - 13
km-modules/km-system/src/main/java/com/km/system/service/impl/SysOssServiceImpl.java

@@ -1,9 +1,13 @@
 package com.km.system.service.impl;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.km.common.core.config.KmConfig;
 import com.km.common.core.constant.CacheNames;
+import com.km.common.core.constant.Constants;
 import com.km.common.core.core.page.PageResult;
 import com.km.common.core.exception.ServiceException;
 import com.km.common.core.service.OssService;
@@ -45,7 +49,6 @@ import static com.km.system.domain.table.SysOssTableDef.SYS_OSS;
  * 文件上传 服务层实现
  *
  * @author km
- * @author km
  * @date 2023-11-30
  */
 @RequiredArgsConstructor
@@ -60,7 +63,7 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
     }
 
     private QueryWrapper buildQueryWrapper(SysOssBo bo) {
-        QueryWrapper queryWrapper = super.buildBaseQueryWrapper()
+        return super.buildBaseQueryWrapper()
             .where(SYS_OSS.FILE_NAME.like(bo.getFileName()))
             .and(SYS_OSS.ORIGINAL_NAME.like(bo.getOriginalName()))
             .and(SYS_OSS.FILE_SUFFIX.eq(bo.getFileSuffix()))
@@ -68,7 +71,6 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
             .and(SYS_OSS.CREATE_TIME.between(bo.getParams().get("beginCreateTime"), bo.getParams().get("endCreateTime")))
             .and(SYS_OSS.SERVICE.eq(bo.getService()))
             .orderBy(SYS_OSS.OSS_ID.asc());
-        return queryWrapper;
     }
 
     @Override
@@ -142,8 +144,9 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
 
     @Override
     public SysOssVo upload(MultipartFile file) {
-        String originalfileName = file.getOriginalFilename();
-        String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
+        String originalFilename = file.getOriginalFilename();
+        assert originalFilename != null;
+        String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length());
         OssClient storage = OssFactory.instance();
         UploadResult uploadResult;
         try {
@@ -152,28 +155,29 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
             throw new ServiceException(e.getMessage());
         }
         // 保存文件信息
-        return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult);
+        return buildResultEntity(originalFilename, suffix, storage.getConfigKey(), uploadResult);
     }
 
     @Override
     public SysOssVo upload(File file) {
-        String originalfileName = file.getName();
-        String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
+        String originalFileName = file.getName();
+        String suffix = StringUtils.substring(originalFileName, originalFileName.lastIndexOf("."), originalFileName.length());
         OssClient storage = OssFactory.instance();
         UploadResult uploadResult = storage.uploadSuffix(file, suffix);
         // 保存文件信息
-        return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult);
+        return buildResultEntity(originalFileName, suffix, storage.getConfigKey(), uploadResult);
     }
 
-    private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) {
+    private SysOssVo buildResultEntity(String originalFileName, String suffix, String configKey, UploadResult uploadResult) {
         SysOss oss = new SysOss();
         oss.setUrl(uploadResult.getUrl());
         oss.setFileSuffix(suffix);
         oss.setFileName(uploadResult.getFilename());
-        oss.setOriginalName(originalfileName);
+        oss.setOriginalName(originalFileName);
         oss.setService(configKey);
         this.save(oss);
         SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class);
+        assert sysOssVo != null;
         return this.matchingUrl(sysOssVo);
     }
 
@@ -185,8 +189,17 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
 
         List<SysOss> list = this.listByIds(ids);
         for (SysOss sysOss : list) {
-            OssClient storage = OssFactory.instance(sysOss.getService());
-            storage.delete(sysOss.getUrl());
+            if (StrUtil.equals("Local",sysOss.getService())) {
+                // 删除本地文件
+                String filePath = KmConfig.getProfile() + StringUtils.substringAfter(sysOss.getFileName(), Constants.RESOURCE_PREFIX);
+                boolean deleted = FileUtil.del(filePath);
+                if (!deleted) {
+                    throw new ServiceException(sysOss.getFileName()+ "文件删除失败,可能是因为文件不存在或无权限删除。");
+                }
+            } else {
+                OssClient storage = OssFactory.instance(sysOss.getService());
+                storage.delete(sysOss.getUrl());
+            }
         }
         return this.removeByIds(ids);
     }
@@ -198,6 +211,9 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
      * @return oss 匹配Url的OSS对象
      */
     private SysOssVo matchingUrl(SysOssVo oss) {
+        if (StrUtil.equals("Local",oss.getService())){
+            return oss;
+        }
         OssClient storage = OssFactory.instance(oss.getService());
         // 仅修改桶类型为 private 的URL,临时URL时长为120s
         if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) {
@@ -205,4 +221,18 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
         }
         return oss;
     }
+
+    @Override
+    public SysOssVo saveResultEntity(String originalFileName, String suffix, String url, String fileName) {
+        SysOss oss = new SysOss();
+        oss.setUrl(url);
+        oss.setFileSuffix(suffix);
+        oss.setFileName(fileName);
+        oss.setOriginalName(originalFileName);
+        oss.setService("Local");
+        this.save(oss);
+        SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class);
+        assert sysOssVo != null;
+        return sysOssVo;
+    }
 }