|
@@ -0,0 +1,211 @@
|
|
|
+package com.backendsys.modules.sdk.tencent.cos.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.io.FileUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.crypto.digest.DigestUtil;
|
|
|
+import com.backendsys.entity.System.SysFile.SysFileCategoryDTO;
|
|
|
+import com.backendsys.entity.System.SysFile.SysFileDTO;
|
|
|
+import com.backendsys.entity.Tencent.TencentCos.MultipartUploadRespDTO;
|
|
|
+import com.backendsys.exception.CustException;
|
|
|
+import com.backendsys.modules.sdk.tencent.cos.service.TencentCosService;
|
|
|
+import com.backendsys.modules.sdk.tencent.cos.utils.TencentCosUtil;
|
|
|
+import com.backendsys.utils.CommonUtil;
|
|
|
+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.model.PutObjectRequest;
|
|
|
+import com.qcloud.cos.model.UploadResult;
|
|
|
+import com.qcloud.cos.region.Region;
|
|
|
+import com.qcloud.cos.transfer.Transfer;
|
|
|
+import com.qcloud.cos.transfer.TransferManager;
|
|
|
+import com.qcloud.cos.transfer.TransferProgress;
|
|
|
+import com.qcloud.cos.transfer.Upload;
|
|
|
+import com.qcloud.cos.utils.IOUtils;
|
|
|
+import net.coobird.thumbnailator.Thumbnails;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
+import java.util.concurrent.Executors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class TencentCosServiceImpl implements TencentCosService {
|
|
|
+
|
|
|
+ @Value("${tencent.cos.max-size}")
|
|
|
+ private long MAX_SIZE;
|
|
|
+ @Value("${tencent.cos.region}")
|
|
|
+ private String REGION;
|
|
|
+ @Value("${tencent.cos.bucket-name}")
|
|
|
+ private String BUCKET_NAME;
|
|
|
+ @Value("${tencent.cos.secret-id}")
|
|
|
+ private String SECRET_ID;
|
|
|
+ @Value("${tencent.cos.secret-key}")
|
|
|
+ private String SECRET_KEY;
|
|
|
+
|
|
|
+ // [腾讯云COS] 生成cos客户端
|
|
|
+ private COSClient getClient() {
|
|
|
+ COSCredentials cred = new BasicCOSCredentials(SECRET_ID, SECRET_KEY);
|
|
|
+ Region region1 = new Region(REGION);
|
|
|
+ ClientConfig clientConfig = new ClientConfig(region1);
|
|
|
+ clientConfig.setRegion(region1);
|
|
|
+ clientConfig.setPrintShutdownStackTrace(false);
|
|
|
+ COSClient cosClient = new COSClient(cred, clientConfig);
|
|
|
+ return cosClient;
|
|
|
+ }
|
|
|
+
|
|
|
+ // [腾讯云COS] 上传对象
|
|
|
+ @Override
|
|
|
+ public UploadResult putObject(MultipartFile file, String object_key) {
|
|
|
+
|
|
|
+ if (file.isEmpty()) throw new CustException("file 上传文件不能为空");
|
|
|
+
|
|
|
+ COSClient cosClient = getClient();
|
|
|
+ try {
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果不传 object_key,则默认使用临时文件夹 (/temp) + MD5文件名
|
|
|
+ if (StrUtil.isEmpty(object_key)) {
|
|
|
+ String md5 = DigestUtil.md5Hex(file.getInputStream());
|
|
|
+ String suffix = FileUtil.extName(file.getOriginalFilename()).toLowerCase();
|
|
|
+ String filename = md5 + "." + suffix;
|
|
|
+ object_key = "temp/" + filename;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建 PutObjectRequest 对象,PutObject 请求。(异步)
|
|
|
+ PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, object_key, tempFile);
|
|
|
+// cosClient.putObject(putObjectRequest); // 普通上传 (没有进度)
|
|
|
+
|
|
|
+ // 高级上传
|
|
|
+ TransferManager transferManager = TencentCosUtil.createTransferManager(cosClient);
|
|
|
+ Upload upload = transferManager.upload(putObjectRequest); // 返回一个异步结果Upload
|
|
|
+ TencentCosUtil.showTransferProgress(upload); // 打印上传进度,直到上传结束
|
|
|
+ UploadResult uploadResult = upload.waitForUploadResult(); // 捕获可能出现的异常
|
|
|
+ return uploadResult;
|
|
|
+
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new CustException(e.getMessage());
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ } finally {
|
|
|
+ if (cosClient != null) cosClient.shutdown();
|
|
|
+ }
|
|
|
+
|
|
|
+//
|
|
|
+// MultipartUploadRespDTO resp = new MultipartUploadRespDTO();
|
|
|
+// try {
|
|
|
+//
|
|
|
+// String md5 = DigestUtil.md5Hex(file.getInputStream());
|
|
|
+// String suffix = FileUtil.extName(file.getOriginalFilename()).toLowerCase();
|
|
|
+// String filename = md5 + "." + suffix;
|
|
|
+// String filenameThumb = filename.replaceAll("." + suffix, "-thumb." + suffix);
|
|
|
+// String key = "temp/" + filename;
|
|
|
+// String keyThumb = "temp/" + filenameThumb;
|
|
|
+// String remotePath = accessibleDomain + "/" + key;
|
|
|
+// String remotePathThumb = accessibleDomain + "/" + keyThumb;
|
|
|
+//
|
|
|
+// // 获得文件分类列表
|
|
|
+// 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();
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+// // -- [DB] 查询数据 ---------------------------------------------
|
|
|
+// SysFileDTO fileDetail = sysFileMapper.queryFileByKey(key);
|
|
|
+// // 如果表中没有数据,则添加数据
|
|
|
+// if (fileDetail == null) {
|
|
|
+// // -- [DB] 插入数据 -----------------------------------------
|
|
|
+// SysFileDTO fileDTO = new SysFileDTO();
|
|
|
+// fileDTO.setUser_id(httpRequestAspect.getUserId());
|
|
|
+// fileDTO.setName(filename);
|
|
|
+// fileDTO.setFile_key(key);
|
|
|
+// fileDTO.setFile_remote_path(remotePath);
|
|
|
+// if (isImage) {
|
|
|
+// fileDTO.setFile_remote_path_thumb(remotePathThumb);
|
|
|
+// }
|
|
|
+// fileDTO.setCategory_id(getCategoryIdBySuffix(suffix));
|
|
|
+// fileDTO.setSize(file.getSize());
|
|
|
+// fileDTO.setMd5(md5);
|
|
|
+// sysFileMapper.insertFile(fileDTO);
|
|
|
+// }
|
|
|
+// // -------------------------------------------------------------
|
|
|
+//
|
|
|
+// resp.setFilename(filename);
|
|
|
+// resp.setKey(key);
|
|
|
+// resp.setMd5(md5);
|
|
|
+// resp.setSize(file.getSize());
|
|
|
+// resp.setPath(remotePath);
|
|
|
+//
|
|
|
+// } catch (IOException e) {
|
|
|
+// throw new CustException(e.getMessage());
|
|
|
+// } finally {
|
|
|
+// if (cosClient != null) {
|
|
|
+// cosClient.shutdown();
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return resp;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|