24282 23 годин тому
батько
коміт
78f8013c12

+ 26 - 20
hx-file/pom.xml

@@ -25,17 +25,17 @@
             <artifactId>ruoyi-framework</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>com.huaweicloud</groupId>
-            <artifactId>esdk-obs-java</artifactId>
-            <version>3.19.7</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.huaweicloud</groupId>-->
+<!--            <artifactId>esdk-obs-java</artifactId>-->
+<!--            <version>3.19.7</version>-->
+<!--        </dependency>-->
 
-        <dependency>
-            <groupId>com.squareup.okio</groupId>
-            <artifactId>okio</artifactId>
-            <version>2.8.0</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.squareup.okio</groupId>-->
+<!--            <artifactId>okio</artifactId>-->
+<!--            <version>2.8.0</version>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>com.fly</groupId>
@@ -44,17 +44,23 @@
             <scope>test</scope>
         </dependency>
 
-        <!--腾讯COS对象存储SDK-->
-        <dependency>
-            <groupId>com.qcloud</groupId>
-            <artifactId>cos_api</artifactId>
-            <version>5.6.155</version>
-        </dependency>
-        <!--腾讯COS对象存储SDK依赖-->
+<!--        &lt;!&ndash;腾讯COS对象存储SDK&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.qcloud</groupId>-->
+<!--            <artifactId>cos_api</artifactId>-->
+<!--            <version>5.6.155</version>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;腾讯COS对象存储SDK依赖&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>commons-codec</groupId>-->
+<!--            <artifactId>commons-codec</artifactId>-->
+<!--            <version>1.10</version>-->
+<!--        </dependency>-->
+
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>1.10</version>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.18.1</version>
         </dependency>
 
     </dependencies>

+ 63 - 89
hx-file/src/main/java/com/fjhx/file/service/impl/FileInfoServiceImpl.java

@@ -3,23 +3,29 @@ package com.fjhx.file.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.MatchMode;
+import com.aliyun.oss.model.PolicyConditions;
+import com.aliyun.oss.model.PutObjectRequest;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.file.entity.*;
+import com.fjhx.file.entity.FileInfo;
+import com.fjhx.file.entity.FileInfoSelectDto;
+import com.fjhx.file.entity.FileInfoVo;
+import com.fjhx.file.entity.ObsFile;
+import com.fjhx.file.entity.SingDto;
+import com.fjhx.file.entity.SingVo;
+import com.fjhx.file.entity.UploadBodyDto;
 import com.fjhx.file.mapper.FileInfoMapper;
 import com.fjhx.file.service.FileInfoService;
-import com.fjhx.file.utils.TencentCosUtils;
-import com.obs.services.ObsClient;
-import com.obs.services.model.PostSignatureRequest;
-import com.obs.services.model.PostSignatureResponse;
-import com.obs.services.model.PutObjectRequest;
 import com.ruoyi.common.constant.BaseSourceConstant;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
@@ -30,7 +36,14 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.*;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
 import java.util.stream.Collectors;
 
 /**
@@ -53,18 +66,6 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
     @Value("${obs.endPoint}")
     private String endPoint;
 
-    @Value("${obs.url}")
-    private String url;
-
-    @Value("${obs.type:}")
-    private String type;
-
-    @Value("${obs.region:}")
-    private String region;
-
-    @Value("${obs.uploadMethod:}")
-    private String uploadMethod;
-
     @Value("${obs.bucketName}")
     private String bucketName;
 
@@ -95,52 +96,35 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
                 .add(IdUtil.fastSimpleUUID() + (ObjectUtil.isEmpty(suffix) ? "" : "." + suffix))
                 .toString();
 
-        //后端上传方式
-        if (Objects.equals(uploadMethod, "back")) {
-            // 封装签名
-            Map<String, String> body = new LinkedHashMap<>();
-            body.put("key", objectKey);
-            singVo.setUploadBody(body);
-
-            // 保存文件
-            FileInfo fileInfo = new FileInfo();
-            fileInfo.setFileUrl(objectKey);
-            fileInfo.setFileName(dto.getFileName());
-            save(fileInfo);
-
-            // 封装文件信息
-            singVo.setUploadUrl("/open/fileInfo/upload");
-            singVo.setId(fileInfo.getId());
-            singVo.setFileName(dto.getFileName());
-            singVo.setFileUrl(url + objectKey);
-
-            return singVo;
-        }
-
-
-        //原华为云前端直传(默认)
-        ObsClient obsClient = null;
-
+        // 获取oss链接实例
+        OSS ossClient = getOssClient();
         try {
-            // 获取oss链接客户端
-            obsClient = getObsClient();
-            // 指定签名有效期为10秒
-            long currentTimeMillis = System.currentTimeMillis() + 1000 * 10;
-            // 获取签名
-            PostSignatureRequest request = new PostSignatureRequest(currentTimeMillis, bucketName, objectKey);
-            PostSignatureResponse temporarySignature = obsClient.createPostSignature(request);
+            long expireTime = 60;
+            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
+            Date expiration = new Date(expireEndTime);
+            PolicyConditions policyConditions = new PolicyConditions();
+            // PostObject请求最大可支持的文件大小为5 GB,在此设置最大上次文件大小为1000M
+            policyConditions.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
+            // MatchMode.Exact:精确匹配    MatchMode.StartWith:前缀匹配
+            policyConditions.addConditionItem(MatchMode.Exact, PolicyConditions.COND_KEY, objectKey);
+
+            String postPolicy = ossClient.generatePostPolicy(expiration, policyConditions);
+            byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
+            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
+            String postSignature = ossClient.calculatePostSignature(postPolicy);
+
             // 封装签名
             Map<String, String> body = new LinkedHashMap<>();
-            body.put("policy", temporarySignature.getPolicy());
-            body.put("AccessKeyId", ak);
-            body.put("signature", temporarySignature.getSignature());
+            body.put("policy", encodedPolicy);
+            body.put("ossAccessKeyId", ak);
+            body.put("signature", postSignature);
             body.put("key", objectKey);
             singVo.setUploadBody(body);
 
         } catch (Exception e) {
             throw new ServiceException("获取签名失败");
         } finally {
-            IoUtil.close(obsClient);
+            ossClient.shutdown();
         }
 
         // 保存文件
@@ -150,10 +134,10 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         save(fileInfo);
 
         // 封装文件信息
-        singVo.setUploadUrl("https://" + bucketName + "." + endPoint);
+        singVo.setUploadUrl(getUrl());
         singVo.setId(fileInfo.getId());
         singVo.setFileName(dto.getFileName());
-        singVo.setFileUrl(url + objectKey);
+        singVo.setFileUrl(singVo.getUploadUrl() + objectKey);
 
         return singVo;
     }
@@ -163,26 +147,15 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         MultipartFile file = uploadBody.getFile();
         String objectKey = uploadBody.getKey();
 
-
-        //腾讯云COS对象存储
-        if (Objects.equals(type, "tencent")) {
-            TencentCosUtils.uploadFile(ak, sk, bucketName,region, objectKey, file);
-        }
-        //华为云OBS对象存储(默认)
-        else if (Objects.equals(type, "huawei")) {
-            ObsClient obsClient = getObsClient();
-            try {
-                PutObjectRequest putObjectRequest = new PutObjectRequest();
-                putObjectRequest.setBucketName(bucketName);
-                putObjectRequest.setObjectKey(objectKey);
-                putObjectRequest.setInput(file.getInputStream());
-                obsClient.putObject(putObjectRequest);
-            } catch (IOException e) {
-                log.error(e.getMessage(), e);
-                throw new ServiceException("华为云 文件上传失败!");
-            } finally {
-                IoUtil.close(obsClient);
-            }
+        OSS ossClient = getOssClient();
+        try {
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, file.getInputStream());
+            ossClient.putObject(putObjectRequest);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+            throw new ServiceException("oss文件上传失败!");
+        } finally {
+            ossClient.shutdown();
         }
     }
 
@@ -199,12 +172,12 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         wrapper.eq("fi", FileInfo::getBusinessType, dto.getFileType());
         List<FileInfoVo> list = this.baseMapper.getList(wrapper);
 
-        if (list.size() == 0) {
+        if (list.isEmpty()) {
             return new HashMap<>();
         }
 
         return list.stream()
-                .peek(fileInfoVo -> fileInfoVo.setFileUrl(url + fileInfoVo.getFileUrl()))
+                .peek(fileInfoVo -> fileInfoVo.setFileUrl(getUrl() + fileInfoVo.getFileUrl()))
                 .collect(Collectors.groupingBy(FileInfoVo::getBusinessId));
     }
 
@@ -217,7 +190,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
     @Override
     public void saveFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
         // 切换到从库
-        if (obsFileList == null || obsFileList.size() == 0) {
+        if (obsFileList == null || obsFileList.isEmpty()) {
             return;
         }
 
@@ -240,7 +213,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
     @DS(BaseSourceConstant.BASE)
     @Override
     public void saveAllFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
-        if (obsFileList == null || obsFileList.size() == 0) {
+        if (obsFileList == null || obsFileList.isEmpty()) {
             return;
         }
         List<FileInfo> fileInfoList = BeanUtil.copyToList(obsFileList, FileInfo.class);
@@ -260,7 +233,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
     @DS(BaseSourceConstant.BASE)
     @Override
     public void editFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
-        if (obsFileList == null || obsFileList.size() == 0) {
+        if (obsFileList == null || obsFileList.isEmpty()) {
             this.remove(q -> q.eq(FileInfo::getBusinessId, businessId).eq(FileInfo::getBusinessType, businessType));
             return;
         }
@@ -321,11 +294,12 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         }
     }
 
-    /**
-     * 获取oss链接客户端
-     */
-    private ObsClient getObsClient() {
-        return new ObsClient(ak, sk, endPoint);
+    private OSS getOssClient() {
+        return new OSSClientBuilder().build(endPoint, ak, sk);
+    }
+
+    private String getUrl() {
+        return "https://" + bucketName + "." + endPoint + "/";
     }
 
     /**

+ 40 - 40
hx-file/src/main/java/com/fjhx/file/utils/TencentCosUtils.java

@@ -1,40 +1,40 @@
-package com.fjhx.file.utils;
-
-import com.qcloud.cos.COSClient;
-import com.qcloud.cos.ClientConfig;
-import com.qcloud.cos.auth.BasicCOSCredentials;
-import com.qcloud.cos.auth.COSCredentials;
-import com.qcloud.cos.http.HttpProtocol;
-import com.qcloud.cos.model.ObjectMetadata;
-import com.qcloud.cos.model.PutObjectRequest;
-import com.qcloud.cos.region.Region;
-import com.qcloud.cos.transfer.TransferManager;
-import com.qcloud.cos.transfer.Upload;
-import com.ruoyi.common.exception.ServiceException;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.multipart.MultipartFile;
-
-@Slf4j
-public class TencentCosUtils {
-
-    public static void uploadFile(String secretId, String secretKey, String bucketName,String regionStr, String objectKey, MultipartFile file) {
-        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
-        Region region = new Region(regionStr);
-        ClientConfig clientConfig = new ClientConfig(region);
-        clientConfig.setHttpProtocol(HttpProtocol.https);
-        COSClient cosClient = new COSClient(cred, clientConfig);
-        TransferManager transferManager = new TransferManager(cosClient);
-        try {
-            ObjectMetadata objectMetadata = new ObjectMetadata();
-            objectMetadata.setContentLength(file.getSize());
-            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, file.getInputStream(), objectMetadata);
-            Upload upload = transferManager.upload(putObjectRequest);
-            upload.waitForUploadResult();
-        } catch (Exception e) {
-            log.error("腾讯云COS对象存储上传异常" + e.getMessage());
-            throw new ServiceException("腾讯云 文件上传失败!");
-        } finally {
-            transferManager.shutdownNow(true);
-        }
-    }
-}
+//package com.fjhx.file.utils;
+//
+//import com.qcloud.cos.COSClient;
+//import com.qcloud.cos.ClientConfig;
+//import com.qcloud.cos.auth.BasicCOSCredentials;
+//import com.qcloud.cos.auth.COSCredentials;
+//import com.qcloud.cos.http.HttpProtocol;
+//import com.qcloud.cos.model.ObjectMetadata;
+//import com.qcloud.cos.model.PutObjectRequest;
+//import com.qcloud.cos.region.Region;
+//import com.qcloud.cos.transfer.TransferManager;
+//import com.qcloud.cos.transfer.Upload;
+//import com.ruoyi.common.exception.ServiceException;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.web.multipart.MultipartFile;
+//
+//@Slf4j
+//public class TencentCosUtils {
+//
+//    public static void uploadFile(String secretId, String secretKey, String bucketName,String regionStr, String objectKey, MultipartFile file) {
+//        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
+//        Region region = new Region(regionStr);
+//        ClientConfig clientConfig = new ClientConfig(region);
+//        clientConfig.setHttpProtocol(HttpProtocol.https);
+//        COSClient cosClient = new COSClient(cred, clientConfig);
+//        TransferManager transferManager = new TransferManager(cosClient);
+//        try {
+//            ObjectMetadata objectMetadata = new ObjectMetadata();
+//            objectMetadata.setContentLength(file.getSize());
+//            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, file.getInputStream(), objectMetadata);
+//            Upload upload = transferManager.upload(putObjectRequest);
+//            upload.waitForUploadResult();
+//        } catch (Exception e) {
+//            log.error("腾讯云COS对象存储上传异常" + e.getMessage());
+//            throw new ServiceException("腾讯云 文件上传失败!");
+//        } finally {
+//            transferManager.shutdownNow(true);
+//        }
+//    }
+//}