Pārlūkot izejas kodu

cos,tos Add close

tsurumure 7 mēneši atpakaļ
vecāks
revīzija
4c45e10e96

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

@@ -15,6 +15,6 @@ public interface DouyinTosService {
     SysUploadResult putObject(MultipartFile multipartFile, String object_key) throws IOException;
 
     // [抖音云COS] 删除对象
-    void deleteObject(String object_key);
+    void deleteObject(String object_key) throws IOException;
 
 }

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

@@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 
 // 对象接口 -> 上传对象
@@ -101,7 +102,7 @@ public class DouyinTosServiceImpl implements DouyinTosService {
      * [抖音云COS] 上传对象
      */
     @Override
-    public SysUploadResult putObject(MultipartFile multipartFile, String object_key) throws IOException {
+    public SysUploadResult putObject(MultipartFile multipartFile, String object_key) {
 
         if (multipartFile.isEmpty()) throw new CustException("file 上传文件不能为空");
 
@@ -118,13 +119,15 @@ public class DouyinTosServiceImpl implements DouyinTosService {
         TOSV2 tos = new TOSV2ClientBuilder().build(REGION, ENDPOINT, ACCESS_KEY_ID, SECRET_ACCESS_KEY);
 
         // TOSV2 提供的所有接口均会抛出 TosException 异常,需要使用 try-catch 进行捕获并处理。
+        InputStream inputStream = null;
         try{
 
             // 设置上传的桶名和对象名
+            inputStream = multipartFile.getInputStream();
             PutObjectInput putObjectInput = new PutObjectInput()
                 .setBucket(BUCKET_NAME)
                 .setKey(object_key)
-                .setContent(multipartFile.getInputStream());
+                .setContent(inputStream);
 
             // 以下代码展示如何处理进度条
             // 在 ObjectMetaRequestOptions 中设置文件大小,可在进度条中显示 total 总长度,否则 DataTransferStatus.getTotalBytes 值为 -1。
@@ -158,6 +161,19 @@ public class DouyinTosServiceImpl implements DouyinTosService {
             // 作为兜底捕获其他异常,一般不会执行到这里
             System.out.println("putObject failed (Throwable)");
             throw new CustException(t.getMessage());
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    // 忽略关闭流时的异常
+                }
+            }
+            try {
+                tos.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
         }
 
     }
@@ -166,11 +182,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.");
+        try {
+            // 初始化 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.");
+            tos.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
     }
 
 }

+ 21 - 56
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/impl/TencentCosServiceImpl.java

@@ -132,6 +132,7 @@ public class TencentCosServiceImpl implements TencentCosService {
 
         // 初始化 CosClient
         COSClient cosClient = getClient();
+        InputStream inputStream = null;
         try {
 
             // [配置]
@@ -164,7 +165,8 @@ public class TencentCosServiceImpl implements TencentCosService {
 //            // --------------------------------------------------------------------
 
             // 创建 PutObjectRequest 对象,PutObject 请求。(异步)
-            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, object_key, multipartFile.getInputStream(), metadata);
+            inputStream = multipartFile.getInputStream();
+            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, object_key, inputStream, metadata);
 
             // 普通上传 (没有进度)
 //          //  cosClient.putObject(putObjectRequest);
@@ -188,57 +190,16 @@ public class TencentCosServiceImpl implements TencentCosService {
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    // 忽略关闭流时的异常
+                }
+            }
             if (cosClient != null) cosClient.shutdown();
         }
 
-//            // 获得文件分类列表
-//            SysFileCategoryDTO categoryDTO = new SysFileCategoryDTO();
-//            List<SysFileCategoryDTO> categoryList = sysFileCategoryMapper.queryFileCategoryList(categoryDTO);
-//
-//            // 获得图片分类的后缀 (待做),再进行以下判断
-//            // 还有删除也要同时删除缩略图
-//            // 还有大文件分片也要做缩略图
-//            // 还有 视频要做截图生成
-//
-//            boolean isImage = Arrays.asList("jpg", "jpeg", "png", "gif", "bmp", "tiff", "webp").contains(suffix.toLowerCase());
-//
-//            // 检查对象是否存在于存储桶中
-//            if (checkObjectExist(cosClient, key)) {
-//                // -- [COS] 对象存在时,直接返回路径 -------------------------------
-//                resp.setIs_fast_upload(true);
-//
-//            } else {
-//                // 获取文件内容
-//                InputStream inputStream = file.getInputStream();
-//
-//                // 将文件内容写入临时文件
-//                String tempFilename = CommonUtil.generateFilename(null);
-//                File tempFile = File.createTempFile(tempFilename, null);
-//                try (FileOutputStream outputStream = new FileOutputStream(tempFile)) {
-//                    IOUtils.copy(inputStream, outputStream);
-//                }
-//                // 创建 PutObjectRequest 对象,PutObject 请求。(异步)
-//                PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, tempFile);
-//                cosClient.putObject(putObjectRequest);
-//
-//
-//                // 创建缩略图
-//                if (isImage) {
-//                    File tempFileThumb = File.createTempFile(tempFilename, "." + suffix);
-//                    String sourceFilePath = tempFileThumb.getPath();
-//                    File sourceFile = new File(sourceFilePath);
-//                    // 使用Thumbnailator生成缩略图并写入到临时文件
-//                    Thumbnails.of(tempFile).size(60, 60).outputQuality(0.2).toFile(tempFileThumb);
-//                    PutObjectRequest putObjectRequestThumb = new PutObjectRequest(bucketName, keyThumb, sourceFile);
-//                    cosClient.putObject(putObjectRequestThumb);
-//                    resp.setPath_thumb(remotePathThumb);
-//                    tempFileThumb.delete();
-//                }
-//
-//                tempFile.delete();
-//
-//            }
-
     }
 
     // [腾讯云COS] 查询对象是否存在
@@ -255,7 +216,6 @@ public class TencentCosServiceImpl implements TencentCosService {
     public void deleteObject(String object_key) {
         COSClient cosClient = getClient();
         cosClient.deleteObject(BUCKET_NAME, object_key);
-        // cosClient.deleteObject(BUCKET_NAME, FilenameUtil.insertThumbSuffix(object_key));
         cosClient.shutdown();
     }
 
@@ -307,6 +267,7 @@ public class TencentCosServiceImpl implements TencentCosService {
     @Override
     public UploadPartResult uploadPart(MultipartFile multipartFile, String upload_id, String object_key, Integer partNumber) {
         COSClient cosClient = getClient();
+        InputStream inputStream = null;
         try {
 
             // "The parameter partNumber is not valid
@@ -314,14 +275,15 @@ public class TencentCosServiceImpl implements TencentCosService {
             long partSize = 524288;
 
 
-
             // 加 partNumber 和 partSize 入参吧
 
             UploadPartRequest uploadPartRequest = new UploadPartRequest();
             uploadPartRequest.setBucketName(BUCKET_NAME);
             uploadPartRequest.setKey(object_key);
             uploadPartRequest.setUploadId(upload_id);
-            uploadPartRequest.setInputStream(multipartFile.getInputStream());
+
+            inputStream = multipartFile.getInputStream();
+            uploadPartRequest.setInputStream(inputStream);
 //            uploadPartRequest.setPartSize(multipartFile.getSize());     // 设置分块的长度
             uploadPartRequest.setPartSize(partSize);     // 设置分块的长度
 //            uploadPartRequest.setPartNumber(partNumber);                // 设置要上传的分块编号,从 1 开始
@@ -329,10 +291,6 @@ public class TencentCosServiceImpl implements TencentCosService {
             return cosClient.uploadPart(uploadPartRequest);
 
 
-
-
-
-
 //            // 每个分块上传之后都会得到一个返回值 etag,保存起来用于最后合并分块时使用
 //            List<PartETag> partETags = new LinkedList<>();
 //            // 上传数据, 这里上传 10 个 1M 的分块数据
@@ -367,6 +325,13 @@ public class TencentCosServiceImpl implements TencentCosService {
         } catch (IOException | CosClientException e) {
             throw new CustException(e.getMessage());
         } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    // 忽略关闭流时的异常
+                }
+            }
             if (cosClient != null) cosClient.shutdown();
         }
     }

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

@@ -35,8 +35,8 @@ public class SysUploadMultipartController {
     @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));
+    public Result initiateMultipartUpload(@RequestParam("file") MultipartFile multipartFile, Long category_id, Integer target) {
+        return Result.success().put("data", sysUploadMultipartService.initiateMultipartUpload(multipartFile, category_id, target));
     }
 
     @SysLog("上传分块")

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

@@ -9,7 +9,7 @@ import java.util.Map;
 public interface SysUploadMultipartService {
 
     // 初始化分块上传
-    Map<String, Object> initiateMultipartUpload(MultipartFile multipartFile, Long category_id);
+    Map<String, Object> initiateMultipartUpload(MultipartFile multipartFile, Long category_id, Integer target);
 
     // 上传分块
     Map<String, Object> uploadMultipart(MultipartFile multipartFile, String upload_id);

+ 14 - 4
src/main/java/com/backendsys/modules/upload/service/impl/SysUploadMultipartServiceImpl.java

@@ -31,11 +31,21 @@ public class SysUploadMultipartServiceImpl implements SysUploadMultipartService
 
     // 初始化分块上传 (获得 upload_id, object_key)
     @Override
-    public Map<String, Object> initiateMultipartUpload(MultipartFile multipartFile, Long category_id) {
+    public Map<String, Object> initiateMultipartUpload(MultipartFile multipartFile, Long category_id, Integer target) {
 
-        InitiateMultipartUploadResult uploadResult = tencentCosService.initiateMultipartUpload(multipartFile);
-        String upload_id = uploadResult.getUploadId();
-        String object_key = uploadResult.getKey();
+        String upload_id = null;
+        String object_key = null;
+
+        // target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
+        if (target == 1) {
+            InitiateMultipartUploadResult uploadResult = tencentCosService.initiateMultipartUpload(multipartFile);
+            upload_id = uploadResult.getUploadId();
+            object_key = uploadResult.getKey();
+        }
+
+        if (StrUtil.isEmpty(upload_id) || StrUtil.isEmpty(object_key)) {
+            throw new CustException("upload_id 或 object_key 不能为空");
+        }
 
         try {
             // 根据文件MD5 判断是否上传过文件 (如果上传过,则仅更新记录,不再上传文件)

+ 5 - 1
src/main/java/com/backendsys/modules/upload/service/impl/SysUploadServiceImpl.java

@@ -177,7 +177,11 @@ public class SysUploadServiceImpl implements SysUploadService {
             }
             if (target == 3) {
                 // [抖音云] 删除对象
-                douyinTosService.deleteObject(object_key);
+                try {
+                    douyinTosService.deleteObject(object_key);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
                 System.out.println("Delete douyin tos object: " + object_key);
             }