Эх сурвалжийг харах

文件服务添加腾讯云对象存储支持

yzc 1 жил өмнө
parent
commit
f70b257cc2

+ 13 - 0
hx-file/pom.xml

@@ -44,6 +44,19 @@
             <scope>test</scope>
         </dependency>
 
+        <!--腾讯COS对象存储SDK-->
+        <dependency>
+            <groupId>com.qcloud</groupId>
+            <artifactId>cos_api</artifactId>
+            <version>5.6.155</version>
+        </dependency>
+        <!--腾讯COS对象存储SDK依赖-->
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.10</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 0 - 1
hx-file/src/main/java/com/fjhx/file/entity/UploadBodyDto.java

@@ -8,6 +8,5 @@ import org.springframework.web.multipart.MultipartFile;
 @Setter
 public class UploadBodyDto {
     private String key;
-    private String fileId;
     private MultipartFile file;
 }

+ 30 - 18
hx-file/src/main/java/com/fjhx/file/service/impl/FileInfoServiceImpl.java

@@ -6,7 +6,6 @@ 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 cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -16,6 +15,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.file.entity.*;
 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.PutObjectRequest;
 import com.ruoyi.common.constant.BaseSourceConstant;
@@ -54,6 +54,9 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
     @Value("${obs.url}")
     private String url;
 
+    @Value("${obs.type}")
+    private String type;
+
     @Value("${obs.bucketName}")
     private String bucketName;
 
@@ -94,13 +97,13 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
 //            // 获取签名
 //            PostSignatureRequest request = new PostSignatureRequest(currentTimeMillis, bucketName, objectKey);
 //            PostSignatureResponse temporarySignature = obsClient.createPostSignature(request);
-            // 封装签名
-            Map<String, String> body = new LinkedHashMap<>();
+        // 封装签名
+        Map<String, String> body = new LinkedHashMap<>();
 //            body.put("policy", temporarySignature.getPolicy());
-            body.put("AccessKeyId", ak);
+//        body.put("AccessKeyId", ak);
 //            body.put("signature", temporarySignature.getSignature());
-            body.put("key", objectKey);
-            singVo.setUploadBody(body);
+        body.put("key", objectKey);
+        singVo.setUploadBody(body);
 //
 //        } catch (Exception e) {
 //            throw new ServiceException("获取签名失败");
@@ -129,19 +132,28 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         MultipartFile file = uploadBody.getFile();
         String objectKey = uploadBody.getKey();
 
-        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);
+
+        //腾讯云COS对象存储
+        if (Objects.equals(type, "tencent")) {
+            TencentCosUtils.uploadFile(ak, sk, bucketName, 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);
+            }
+        }
+
     }
 
     @DS(BaseSourceConstant.BASE)

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

@@ -0,0 +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 objectKey, MultipartFile file) {
+        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
+        Region region = new Region("ap-shanghai");
+        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);
+        }
+    }
+}

+ 11 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -188,4 +188,14 @@ obs:
   sk: ZowLEoMJrICA9tOyln0yWVm0xGSiupe0gnbsZimk
   endPoint: obs.cn-south-1.myhuaweicloud.com
   url: https://os.winfaster.cn/
-  bucketName: winfaster
+  bucketName: winfaster
+#obs:
+#  #huawei / tencent
+#  type: tencent
+#  #secretId
+#  ak: AKIDmPqHhzAHM9sSwFd4dHpIm9MNBnMnIk7T
+#  #secretKey
+#  sk: XBjFf1Lc1VM3b1IRtHPKIRZhyCYqDf1G
+#  endPoint: cos.ap-shanghai.myqcloud.com
+#  url: https://xmhjc-1322241475.cos.ap-shanghai.myqcloud.com/
+#  bucketName: xmhjc-1322241475