OssConfig.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package com.njuzr.eaibackend.config;
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.OSSClientBuilder;
  4. import com.aliyun.oss.model.*;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import java.util.concurrent.ConcurrentHashMap;
  13. /**
  14. * @author: Leonezhurui
  15. * @Date: 2024/3/13 - 09:15
  16. * @Package: EAI-Backend
  17. */
  18. @Configuration
  19. public class OssConfig {
  20. @Value("oss-cn-shanghai.aliyuncs.com")
  21. private String endpoint;
  22. @Value("${aliyun.oss.accessKeyId}")
  23. private String accessKeyId;
  24. @Value("${aliyun.oss.accessKeySecret}")
  25. private String accessKeySecret;
  26. @Value("${aliyun.oss.bucketName}")
  27. private String bucketName;
  28. private OSS ossClient;
  29. // 存储uploadId的映射,key为fileMd5
  30. private final ConcurrentHashMap<String, String> uploadIdMap = new ConcurrentHashMap<>();
  31. // 存储已上传分片的映射,key为fileMd5
  32. private final ConcurrentHashMap<String, List<PartETag>> partETagsMap = new ConcurrentHashMap<>();
  33. @Bean
  34. public OSS ossClient() {
  35. if(null == this.ossClient){
  36. this.ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  37. }
  38. return this.ossClient;
  39. }
  40. /**
  41. * 初始化分片上传
  42. */
  43. public String initMultipartUpload(String fileMd5, String fileName) {
  44. String objectName = "uploads/" + fileMd5+"-" + fileName;
  45. InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
  46. InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
  47. String uploadId = result.getUploadId();
  48. System.out.println("init"+ uploadId);
  49. uploadIdMap.put(fileMd5, uploadId);
  50. partETagsMap.put(fileMd5, new ArrayList<>());
  51. return uploadId;
  52. }
  53. public boolean isUploadInitialized(String fileMd5) {
  54. return uploadIdMap.containsKey(fileMd5);
  55. }
  56. /**
  57. * 上传分片
  58. */
  59. public boolean uploadPart(String fileName,String fileMd5, int partNumber, InputStream inputStream, long partSize) throws IOException {
  60. String uploadId = uploadIdMap.get(fileMd5);
  61. if (uploadId == null) {
  62. throw new RuntimeException("未找到对应的uploadId,请先初始化分片上传");
  63. }
  64. String objectName = "uploads/" + fileMd5 + "-" + fileName;
  65. UploadPartRequest uploadPartRequest = new UploadPartRequest();
  66. uploadPartRequest.setBucketName(bucketName);
  67. uploadPartRequest.setKey(objectName);
  68. uploadPartRequest.setUploadId(uploadId);
  69. uploadPartRequest.setInputStream(inputStream);
  70. uploadPartRequest.setPartSize(partSize);
  71. uploadPartRequest.setPartNumber(partNumber);
  72. UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
  73. partETagsMap.get(fileMd5).add(uploadPartResult.getPartETag());
  74. return true;
  75. }
  76. /**
  77. * 完成分片上传
  78. */
  79. public String completeMultipartUpload(String fileMd5, String fileName) {
  80. String uploadId = uploadIdMap.get(fileMd5);
  81. if (uploadId == null) {
  82. throw new RuntimeException("未找到对应的uploadId");
  83. }
  84. String objectName = "uploads/" + fileMd5 + "-" + fileName;
  85. CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
  86. bucketName,
  87. objectName,
  88. uploadId,
  89. partETagsMap.get(fileMd5));
  90. CompleteMultipartUploadResult result = ossClient.completeMultipartUpload(completeRequest);
  91. // 清理资源
  92. uploadIdMap.remove(fileMd5);
  93. partETagsMap.remove(fileMd5);
  94. // 生成文件访问URL
  95. return generateFileUrl(objectName);
  96. }
  97. private String generateFileUrl(String objectName) {
  98. return "https://" + bucketName + "." + endpoint.replace("https://", "") + "/" + objectName;
  99. }
  100. /**
  101. * 取消分片上传
  102. */
  103. public void abortMultipartUpload(String fileMd5, String filName) {
  104. String uploadId = uploadIdMap.get(fileMd5);
  105. if (uploadId != null) {
  106. String objectName = "uploads/" + fileMd5 + "-" + filName;
  107. AbortMultipartUploadRequest abortRequest =
  108. new AbortMultipartUploadRequest(bucketName, objectName, uploadId);
  109. ossClient.abortMultipartUpload(abortRequest);
  110. uploadIdMap.remove(fileMd5);
  111. partETagsMap.remove(fileMd5);
  112. }
  113. }
  114. /**
  115. * 获取已上传的分片数量
  116. */
  117. public int getChunkCount(String fileMd5) {
  118. List<PartETag> partETags = partETagsMap.get(fileMd5);
  119. return partETags != null ? partETags.size() : 0;
  120. }
  121. /**
  122. * 关闭OSS客户端
  123. */
  124. public void shutdown() {
  125. if (ossClient != null) {
  126. ossClient.shutdown();
  127. }
  128. }
  129. }