UploadTencentCOSController.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package com.backendsys.controller.Upload;
  2. import com.backendsys.entity.System.SysFile.SysFileDTO;
  3. import com.backendsys.entity.Tencent.TencentCos.MultipartUploadDTO;
  4. import com.backendsys.service.SDKService.SDKTencent.SDKTencentCOSService;
  5. import com.backendsys.utils.CommonUtil;
  6. import com.backendsys.utils.response.Result;
  7. import com.backendsys.utils.response.ResultEnum;
  8. import com.qcloud.cos.COSClient;
  9. import com.qcloud.cos.ClientConfig;
  10. import com.qcloud.cos.auth.BasicCOSCredentials;
  11. import com.qcloud.cos.auth.COSCredentials;
  12. import com.qcloud.cos.model.*;
  13. import com.qcloud.cos.region.Region;
  14. import com.qcloud.cos.utils.IOUtils;
  15. import jakarta.validation.constraints.NotEmpty;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.security.access.prepost.PreAuthorize;
  19. import org.springframework.validation.annotation.Validated;
  20. import org.springframework.web.bind.annotation.*;
  21. import org.springframework.web.multipart.MultipartFile;
  22. import java.io.File;
  23. import java.io.FileOutputStream;
  24. import java.io.IOException;
  25. import java.io.InputStream;
  26. import java.text.SimpleDateFormat;
  27. import java.util.Date;
  28. import java.util.LinkedHashMap;
  29. import java.util.Map;
  30. @Validated
  31. @RestController
  32. public class UploadTencentCOSController {
  33. @Value("${tencent.cos.max-size}")
  34. private long maxSize;
  35. @Value("${tencent.cos.secret-id}")
  36. private String secretId;
  37. @Value("${tencent.cos.secret-key}")
  38. private String secretKey;
  39. @Value("${tencent.cos.region}")
  40. private String region;
  41. @Value("${tencent.cos.bucket-name}")
  42. private String bucketName;
  43. @Value("${tencent.cos.accessible-domain}")
  44. private String accessibleDomain;
  45. @Autowired
  46. private SDKTencentCOSService sdkTencentCOSService;
  47. /**
  48. * 权限:待定
  49. * 获得临时上传密钥 (用于前端单文件上传、分片上传)
  50. */
  51. @GetMapping("/api/upload/getTempCredentials")
  52. public Result getTempCredentials() {
  53. return Result.success(sdkTencentCOSService.getTempCredentials("*"));
  54. }
  55. // /**
  56. // * 权限:待定
  57. // * 获得素材文件列表
  58. // */
  59. // @GetMapping("/api/upload/getBucketList")
  60. // public Result getBucketList(String next_marker) {
  61. // return Result.success(sdkTencentCOSService.getBucketList(next_marker));
  62. // }
  63. // 【腾讯云 COS】
  64. // 文档中心 > 对象存储 > API 文档 > Object 接口 > 基本操作 > PUT Object
  65. // https://cloud.tencent.com/document/product/436/7749
  66. // https://github.com/tencentyun/cos-java-sdk-v5/blob/master/src/main/java/com/qcloud/cos/demo/PutObjectDemo.java
  67. /**
  68. * 上传文件 (旧)
  69. */
  70. @PreAuthorize("@ss.hasPermi(1.1)")
  71. @PostMapping("/api/tencent/cosUpload")
  72. public Result uploadTencentCOS(@RequestParam("file") MultipartFile file) {
  73. // 检查上传的文件是否为空
  74. if (file.isEmpty()) {
  75. return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), "文件不能为空");
  76. }
  77. // 判断文件大小是否超过
  78. if (file.getSize() > maxSize) {
  79. return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), "文件不能大于 " + maxSize/1024/1024 + " MB");
  80. }
  81. // 按日期作为文件目录 (腾讯云使用 /,所以不需要配置 File.separator)
  82. String dateDir = new SimpleDateFormat("yyyyMMdd").format(new Date()) + '/';
  83. // 生成后缀名
  84. String originalFileName = file.getOriginalFilename();
  85. String suffix = originalFileName.substring(originalFileName.lastIndexOf("."));
  86. // 生成新的文件名
  87. String newFileName = CommonUtil.generateFilename(suffix);
  88. //
  89. String objectName = dateDir + newFileName;
  90. // -- COS ------------------------------------------------------------------
  91. // 初始化用户身份信息(secretId, secretKey)
  92. COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
  93. // 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224
  94. Region region1 = new Region(region);
  95. ClientConfig clientConfig = new ClientConfig(region1);
  96. clientConfig.setRegion(region1);
  97. // 生成cos客户端
  98. COSClient cosClient = new COSClient(cred, clientConfig);
  99. try {
  100. // 获取文件内容
  101. InputStream inputStream = file.getInputStream();
  102. // 将文件内容写入临时文件
  103. File tempFile = File.createTempFile("temp", null);
  104. try (FileOutputStream outputStream = new FileOutputStream(tempFile)) {
  105. IOUtils.copy(inputStream, outputStream);
  106. }
  107. // 创建 PutObjectRequest 对象。
  108. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, tempFile);
  109. ObjectMetadata objectMetadata = new ObjectMetadata();
  110. putObjectRequest.withMetadata(objectMetadata);
  111. // 创建 PutObject 请求。(异步)
  112. PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
  113. } catch (IOException e) {
  114. System.out.println("IOException e:");
  115. System.out.println(e);
  116. } finally {
  117. if (cosClient != null) {
  118. cosClient.shutdown();
  119. }
  120. }
  121. // 返回值 结构
  122. Map<String, Object> map = new LinkedHashMap<>();
  123. map.put("filename", newFileName);
  124. map.put("url", accessibleDomain + "/" + objectName); // File.separator
  125. map.put("type", suffix.replace(".", ""));
  126. map.put("size", file.getSize());
  127. return Result.success(map);
  128. }
  129. /**
  130. * 简单上传文件
  131. */
  132. @PreAuthorize("@ss.hasPermi(1.1)")
  133. @PostMapping("/api/upload/simpleUpload")
  134. public Result simpleUpload(@RequestParam("file") MultipartFile file) {
  135. return Result.success(sdkTencentCOSService.simpleUpload(file));
  136. }
  137. /**
  138. * 大文件分块上传
  139. */
  140. @PreAuthorize("@ss.hasPermi(1.1)")
  141. @PostMapping("/api/upload/multipartUpload")
  142. public Result multipartUpload(@Validated(MultipartUploadDTO.Upload.class) MultipartUploadDTO multipartUploadDTO) {
  143. return Result.success(sdkTencentCOSService.multipartUpload(multipartUploadDTO));
  144. }
  145. /**
  146. * 查询已上传分块
  147. */
  148. @PreAuthorize("@ss.hasPermi(1.1)")
  149. @GetMapping("/api/upload/listParts")
  150. public Result listParts(@NotEmpty(message="upload_id 不能为空") String upload_id, @NotEmpty(message="key 不能为空") String key) {
  151. return Result.success(sdkTencentCOSService.listParts(upload_id, key));
  152. }
  153. /**
  154. * 查询分块上传任务ID
  155. */
  156. @PreAuthorize("@ss.hasPermi(1.1)")
  157. @GetMapping("/api/upload/getMultipartUploadIds")
  158. public Result getMultipartUploadIds(@NotEmpty(message="key 不能为空") String key) {
  159. return Result.success(sdkTencentCOSService.listMultipartUploads(key));
  160. }
  161. /**
  162. * 终止分块上传任务
  163. */
  164. @PreAuthorize("@ss.hasPermi(1.1)")
  165. @PostMapping("/api/upload/abortMultipartUpload")
  166. public Result abortMultipartUpload(@Validated(MultipartUploadDTO.Abort.class) @RequestBody MultipartUploadDTO multipartUploadDTO) {
  167. return Result.success(sdkTencentCOSService.abortMultipartUpload(multipartUploadDTO));
  168. }
  169. /**
  170. * 删除文件
  171. */
  172. @PreAuthorize("@ss.hasPermi(1.1)")
  173. @DeleteMapping("/api/upload/removeUploadFile")
  174. public Result removeUploadFile(@Validated(SysFileDTO.Remove.class) @RequestBody SysFileDTO sysFileDTO) {
  175. return Result.success(sdkTencentCOSService.removeUploadFile(sysFileDTO));
  176. }
  177. }