Browse Source

完善抖音云上传功能

tsurumure 7 months ago
parent
commit
7c9e1d95f4

+ 1 - 0
db/sys_upload.sql

@@ -18,6 +18,7 @@ CREATE TABLE `sys_upload` (
     `object_key` VARCHAR(500) NOT NULL COMMENT 'ObjectKey',
     `size` INT COMMENT '文件大小',
     `md5` VARCHAR(255) COMMENT '文件MD5',
+    `target` INT COMMENT '上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)',
     `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统上传文件表';

+ 7 - 0
src/main/java/com/backendsys/modules/sdk/douyincloud/tos/service/DouyinTosService.java

@@ -5,9 +5,16 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 
+/**
+ * 文档首页/对象存储/SDK参考/Java/对象接口/上传对象/普通上传(Java SDK)
+ * https://www.volcengine.com/docs/6349/79898
+ */
 public interface DouyinTosService {
 
     // [抖音云COS] 上传对象
     SysUploadResult putObject(MultipartFile multipartFile, String object_key) throws IOException;
 
+    // [抖音云COS] 删除对象
+    void deleteObject(String object_key);
+
 }

+ 13 - 3
src/main/java/com/backendsys/modules/sdk/douyincloud/tos/service/impl/DouyinTosServiceImpl.java

@@ -13,9 +13,7 @@ import com.volcengine.tos.TosServerException;
 import com.volcengine.tos.comm.event.DataTransferListener;
 import com.volcengine.tos.comm.event.DataTransferStatus;
 import com.volcengine.tos.comm.event.DataTransferType;
-import com.volcengine.tos.model.object.ObjectMetaRequestOptions;
-import com.volcengine.tos.model.object.PutObjectInput;
-import com.volcengine.tos.model.object.PutObjectOutput;
+import com.volcengine.tos.model.object.*;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -129,4 +127,16 @@ public class DouyinTosServiceImpl implements DouyinTosService {
         }
 
     }
+
+    /**
+     * [抖音云COS] 删除对象
+     */
+    public void deleteObject(String object_key) {
+        // 初始化 TosClient
+        TOSV2 tos = new TOSV2ClientBuilder().build(REGION, ENDPOINT, ACCESS_KEY_ID, SECRET_ACCESS_KEY);
+        DeleteObjectInput input = new DeleteObjectInput().setBucket(BUCKET_NAME).setKey(object_key);
+        tos.deleteObject(input);
+        System.out.println("deleteObject succeed.");
+    }
+
 }

+ 15 - 17
src/main/java/com/backendsys/modules/upload/controller/SysUploadController.java

@@ -7,6 +7,7 @@ import com.backendsys.modules.sse.emitter.SseEmitterManager;
 import com.backendsys.modules.sse.utils.SseEmitterUTF8;
 import com.backendsys.modules.upload.entity.SysUpload;
 import com.backendsys.modules.upload.service.SysUploadService;
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -31,23 +32,20 @@ public class SysUploadController {
      * 获取上传文件列表
      * - 缩略图 (?imageView2/1/w/100/h/100/q/60)
      */
+    @Operation(summary = "获取上传文件列表")
     @GetMapping("/api/v2/upload/getUploadFileList")
     public Result getUploadFileList(@Validated SysUpload sysUpload) {
         return Result.success().put("data", sysUploadService.selectUploadList(sysUpload));
     }
 
-    /**
-     * 上传文件 (普通上传,单文件上传不超过 20MB)
-     */
+    @Operation(summary = "上传文件 (普通上传,单文件上传不超过 100MB)")
     @PreAuthorize("@sr.hasPermission(1.1)")
     @PostMapping("/api/upload/uploadSmall")
-    public Result uploadSmall(@RequestParam("file") MultipartFile multipartFile, Long category_id) {
-        return Result.success().put("data", sysUploadService.uploadSmall(multipartFile, category_id));
+    public Result uploadSmall(@RequestParam("file") MultipartFile multipartFile, Long category_id, Integer target) {
+        return Result.success().put("data", sysUploadService.uploadSmall(multipartFile, category_id, target));
     }
 
-    /**
-     * [SSE] 上传进度监听
-     */
+    @Operation(summary = "上传进度监听 (SSE)")
     @GetMapping(value = "/api/sse/stream/upload", produces = "text/event-stream;charset=UTF-8")
     public SseEmitter streamUpload() {
         String userId = Convert.toStr(httpRequestUtil.getUserId());
@@ -64,9 +62,18 @@ public class SysUploadController {
         }
         return emitter;
     }
+
+    @Operation(summary = "删除上传文件")
+    @PreAuthorize("@sr.hasPermission(1.1)")
+    @DeleteMapping("/api/v2/upload/removeUploadFile")
+    public Result removeUploadFile(@Validated(SysUpload.Delete.class) @RequestBody SysUpload sysUpload) {
+        return Result.success().put("data", sysUploadService.removeUploadFile(sysUpload));
+    }
+
 //    /**
 //     * [SSE] 测试发送
 //     */
+//    @Operation(summary = "测试发送 (SSE)")
 //    @GetMapping("/api/v2/sse/send")
 //    public String send() {
 //        String message = "{\"message\": \"Hello World\"}";
@@ -74,13 +81,4 @@ public class SysUploadController {
 //        return "success";
 //    }
 
-    /**
-     * 删除上传文件
-     */
-    @PreAuthorize("@sr.hasPermission(1.1)")
-    @DeleteMapping("/api/v2/upload/removeUploadFile")
-    public Result removeUploadFile(@Validated(SysUpload.Delete.class) @RequestBody SysUpload sysUpload) {
-        return Result.success().put("data", sysUploadService.removeUploadFile(sysUpload));
-    }
-
 }

+ 4 - 9
src/main/java/com/backendsys/modules/upload/controller/SysUploadMultipartController.java

@@ -3,6 +3,7 @@ package com.backendsys.modules.upload.controller;
 import com.backendsys.entity.Tencent.TencentCos.MultipartUploadDTO;
 import com.backendsys.modules.common.utils.Result;
 import com.backendsys.modules.upload.service.SysUploadMultipartService;
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -29,27 +30,21 @@ public class SysUploadMultipartController {
         3.完成分块上传(Complete Multipart Upload)。
      */
 
-    /**
-     * 初始化分块上传
-     */
+    @Operation(summary = "初始化分块上传")
     @PreAuthorize("@sr.hasPermission(1.1)")
     @PostMapping("/api/upload/initiateMultipartUpload")
     public Result initiateMultipartUpload(@RequestParam("file") MultipartFile multipartFile, Long category_id) {
         return Result.success().put("data", sysUploadMultipartService.initiateMultipartUpload(multipartFile, category_id));
     }
 
-    /**
-     * 上传分块
-     */
+    @Operation(summary = "上传分块")
     @PreAuthorize("@sr.hasPermission(1.1)")
     @PostMapping("/api/upload/uploadMultipart")
     public Result uploadMultipart(@RequestParam("file") MultipartFile multipartFile, String upload_id) {
         return Result.success().put("data", sysUploadMultipartService.uploadMultipart(multipartFile, upload_id));
     }
 
-    /**
-     * 查询分块上传情况
-     */
+    @Operation(summary = "查询分块上传情况")
     @PreAuthorize("@sr.hasPermission(1.1)")
     @GetMapping("/api/upload/getListParts")
     public Result getListParts(String upload_id, String object_key) {

+ 1 - 0
src/main/java/com/backendsys/modules/upload/entity/SysUpload.java

@@ -26,6 +26,7 @@ public class SysUpload {
     private String object_key;
     private Long size;
     private String md5;
+    private Integer target;         // 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
     private String create_time;
     private String update_time;
 }

+ 1 - 1
src/main/java/com/backendsys/modules/upload/service/SysUploadService.java

@@ -12,7 +12,7 @@ public interface SysUploadService {
     PageEntity selectUploadList(SysUpload sysUpload);
 
     // 上传文件 (单文件大小不超过 n)
-    SysUpload uploadSmall(MultipartFile file, Long category_id);
+    SysUpload uploadSmall(MultipartFile file, Long category_id, Integer target);
 
     // 删除上传文件
     Map<String, Object> removeUploadFile(SysUpload sysUpload);

+ 36 - 17
src/main/java/com/backendsys/modules/upload/service/impl/SysUploadServiceImpl.java

@@ -54,17 +54,16 @@ public class SysUploadServiceImpl implements SysUploadService {
 
     /**
      * 上传文件 (单文件大小不超过 n)
-     * - 5MB = 5242880
-     * - 20MB = 20971520
-     * - 100MB = 104857600
-     * - 1GB = 1073741824
+     * - target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
      */
     @Override
-    public SysUpload uploadSmall(MultipartFile multipartFile, Long category_id) {
+    public SysUpload uploadSmall(MultipartFile multipartFile, Long category_id, Integer target) {
         try {
 
+            if (target == null) throw new CustException("target 上传目标不能为空 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)");
+
             // 判断文件是否超过大小
-            long MAX_SIZE = 20971520;
+            long MAX_SIZE = 100L * 1024 * 1024; // 100MB
             if (multipartFile.getSize() > MAX_SIZE) {
                 throw new CustException("上传文件不能大于 " + MAX_SIZE / 1024 / 1024 + " MB,请使用大文件上传功能");
             }
@@ -74,11 +73,17 @@ public class SysUploadServiceImpl implements SysUploadService {
             SysUpload sysUploadEntity = sysUploadDao.selectOne(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getMd5, md5));
             if (sysUploadEntity == null) {
 
-                // [腾讯云-上传对象]
-                SysUploadResult uploadResult = tencentCosService.putObject(multipartFile, null);
+                SysUploadResult uploadResult = new SysUploadResult();
 
-//                // [抖音云-上传对象]
-//                SysUploadResult uploadResult = douyinTosService.putObject(multipartFile, null);
+                // target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
+                if (target == 1) {
+                    // [腾讯云-上传对象]
+                    uploadResult = tencentCosService.putObject(multipartFile, null);
+                }
+                if (target == 3) {
+                    // [抖音云-上传对象]
+                    uploadResult = douyinTosService.putObject(multipartFile, null);
+                }
 
                 // [新增] 上传文件记录
                 sysUploadEntity = new SysUpload();
@@ -91,11 +96,12 @@ public class SysUploadServiceImpl implements SysUploadService {
                 sysUploadEntity.setUrl(uploadResult.getDomain() + "/" + uploadResult.getKey());
                 sysUploadEntity.setSize(multipartFile.getSize());
                 sysUploadEntity.setMd5(uploadResult.getE_tag());
+                sysUploadEntity.setTarget(target);
                 sysUploadEntity.setCreate_time(DateUtil.now());
                 sysUploadEntity.setUpdate_time(DateUtil.now());
                 sysUploadDao.insert(sysUploadEntity);
             } else {
-                // [更新] 上传文件记录
+                // [更新] 上传文件记录 (更换文件分类)
                 sysUploadEntity.setCategory_id(category_id);
                 sysUploadEntity.setUpdate_time(DateUtil.now());
                 sysUploadDao.updateById(sysUploadEntity);
@@ -113,20 +119,33 @@ public class SysUploadServiceImpl implements SysUploadService {
     @Override
     public Map<String, Object> removeUploadFile(SysUpload sysUpload) {
 
+        String object_key = sysUpload.getObject_key();
+
         // [Delete] 删除文件记录
-        SysUpload entity = sysUploadDao.selectOne(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getObject_key, sysUpload.getObject_key()));
+        SysUpload entity = sysUploadDao.selectOne(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getObject_key, object_key));
         if (entity != null) {
-            sysUploadDao.delete(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getObject_key, sysUpload.getObject_key()));
+            sysUploadDao.delete(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getObject_key, object_key));
         }
 
         // [异步任务] 创建一个 CompletableFuture 来执行异步任务
         CompletableFuture.runAsync(() -> {
-            // [腾讯云] 删除对象
-            tencentCosService.deleteObject(sysUpload.getObject_key());
-            System.out.println("Delete cos object: " + sysUpload.getObject_key());
+
+            // target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
+            Integer target = entity.getTarget();
+            if (target == 1) {
+                // [腾讯云] 删除对象
+                tencentCosService.deleteObject(object_key);
+                System.out.println("Delete tencent cos object: " + object_key);
+            }
+            if (target == 3) {
+                // [抖音云] 删除对象
+                douyinTosService.deleteObject(object_key);
+                System.out.println("Delete douyin tos object: " + object_key);
+            }
+
         });
 
-        return Map.of("object_key", sysUpload.getObject_key());
+        return Map.of("object_key", object_key);
     }
 
 }