AliyunOssTemplate.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package com.fdkankan.scene.oss.aliyun;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.aliyun.oss.OSS;
  5. import com.aliyun.oss.model.*;
  6. import com.fdkankan.scene.constant.CmdConstant;
  7. import com.fdkankan.scene.oss.Consumer;
  8. import com.fdkankan.scene.oss.InnerUtils;
  9. import com.fdkankan.scene.oss.OssOptions;
  10. import com.fdkankan.scene.util.CmdUtils;
  11. import lombok.Getter;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.util.Base64Utils;
  14. import org.springframework.util.StringUtils;
  15. import java.io.ByteArrayInputStream;
  16. import java.io.File;
  17. import java.io.IOException;
  18. import java.io.InputStream;
  19. import java.nio.charset.StandardCharsets;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. import java.util.UUID;
  23. /**
  24. * 阿里云操作模版类, 简化常见操作
  25. */
  26. @Getter
  27. @Slf4j
  28. public class AliyunOssTemplate implements OssOptions<ObjectMetadata> {
  29. private final OSS ossClient;
  30. private final AliyunOssProperties ossProperties;
  31. AliyunOssTemplate(OSS ossClient, AliyunOssProperties ossProperties) {
  32. this.ossClient = ossClient;
  33. this.ossProperties = ossProperties;
  34. }
  35. @Override
  36. public void uploadFileChunkCmd(String defaultFolder, String sceneCode, String uploadDir, String targetDir, String mergeCode) {
  37. String cmd = CmdConstant.OSSUTIL_UPLOAD_DIR_CHUNK;
  38. cmd = cmd.replaceAll("@defaultFolder", defaultFolder);
  39. cmd = cmd.replaceAll("@sceneCode", sceneCode);
  40. cmd = cmd.replaceAll("@mergeCode", mergeCode);
  41. cmd = cmd.replaceAll("@uploadDir", uploadDir);
  42. cmd = cmd.replaceAll("@target", targetDir);
  43. CmdUtils.ossUploadDir(cmd);
  44. }
  45. @Override
  46. public void uploadFileDirCmd(String uploadDir, String target) {
  47. String cmd = CmdConstant.OSSUTIL_UPLOAD_DIR;
  48. cmd = cmd.replaceAll("@uploadDir", uploadDir);
  49. cmd = cmd.replaceAll("@target", target);
  50. CmdUtils.ossUploadDir(cmd);
  51. }
  52. @Override
  53. public String uploadFile(String pathKey, String filePath) {
  54. return uploadFile(ossProperties.getBucket(), pathKey, filePath);
  55. }
  56. @Override
  57. public void rmFileCmd(String targetDir) {
  58. String cmd = CmdConstant.OSSUTIL_RM_DIR;
  59. cmd = cmd.replaceAll("@target", targetDir);
  60. CmdUtils.ossDeleteDir(cmd);
  61. }
  62. @Override
  63. public String uploadFile(String bucket, String pathKey, String filePath) {
  64. InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty");
  65. InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty");
  66. ObjectMetadata metadata = new ObjectMetadata();
  67. ossClient.putObject(bucket, pathKey, new File(filePath), metadata);
  68. return pathKey;
  69. }
  70. @Override
  71. public String uploadFileText(String pathKey, String content) {
  72. return uploadFileText(ossProperties.getBucket(), pathKey, content);
  73. }
  74. @Override
  75. public String uploadFileText(String bucket, String pathKey, String content) {
  76. byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
  77. return uploadFileBytes(bucket, pathKey, bytes);
  78. }
  79. @Override
  80. public String uploadFileBase64Image(String pathKey, String content) {
  81. return uploadFileBase64Image(ossProperties.getBucket(), pathKey, content);
  82. }
  83. @Override
  84. public String uploadFileBase64Image(String bucket, String pathKey, String content) {
  85. byte[] bytes = Base64Utils.decodeFromString(content);
  86. return uploadFileBytes(bucket, pathKey, bytes);
  87. }
  88. @Override
  89. public String uploadFileBytes(String pathKey, byte[] bytes) {
  90. return uploadFileBytes(ossProperties.getBucket(), pathKey, bytes);
  91. }
  92. @Override
  93. public String uploadFileBytes(String bucket, String pathKey, byte[] bytes) {
  94. ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
  95. return uploadFileStream(bucket, pathKey, stream);
  96. }
  97. @Override
  98. public String uploadFileStream(String pathKey, InputStream stream) {
  99. return uploadFileStream(ossProperties.getBucket(), pathKey, stream);
  100. }
  101. @Override
  102. public String uploadFileStream(String bucket, String pathKey, InputStream stream) {
  103. InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty");
  104. InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty");
  105. InnerUtils.checkArgument(stream != null, "stream can't be null");
  106. ObjectMetadata metadata = new ObjectMetadata();
  107. ossClient.putObject(bucket, pathKey, stream, metadata);
  108. return pathKey;
  109. }
  110. @Override
  111. public File downloadFileTmp(String pathKey) {
  112. return downloadFileTmp(ossProperties.getBucket(), pathKey);
  113. }
  114. @Override
  115. public File downloadFileTmp(String bucket, String pathKey) {
  116. String tmpDir = System.getProperty("java.io.tmpdir");
  117. String file = tmpDir + UUID.randomUUID();
  118. downloadFile(bucket, pathKey, file);
  119. return new File(file);
  120. }
  121. @Override
  122. public ObjectMetadata downloadFile(String pathKey, String file) {
  123. return downloadFile(ossProperties.getBucket(), pathKey, file);
  124. }
  125. @Override
  126. public ObjectMetadata downloadFile(String bucket, String pathKey, String file) {
  127. InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty");
  128. InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty");
  129. InnerUtils.checkArgument(file != null && file.length() > 0, "file can't be empty");
  130. GetObjectRequest request = new GetObjectRequest(bucket, pathKey);
  131. AliyunOssTemplate.log.info("下载开始:下载bucket={},下载pathKey={},下载filePath={}", bucket, pathKey, file);
  132. return ossClient.getObject(request, new File(file));
  133. }
  134. @Override
  135. public ObjectMetadata downloadFile(String pathKey, Consumer<InputStream> handler) {
  136. return downloadFile(ossProperties.getBucket(), pathKey, handler);
  137. }
  138. @Override
  139. public ObjectMetadata downloadFile(String bucket, String pathKey, Consumer<InputStream> handler) {
  140. InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty");
  141. InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty");
  142. InnerUtils.checkArgument(handler != null, "handler can't be null");
  143. OSSObject ossObject = ossClient.getObject(bucket, pathKey);
  144. InputStream content = ossObject.getObjectContent();
  145. try {
  146. handler.accept(content);
  147. } finally {
  148. if (content != null) {
  149. try {
  150. content.close();
  151. } catch (IOException e) {
  152. // Ignore
  153. }
  154. }
  155. }
  156. return ossObject.getObjectMetadata();
  157. }
  158. public String calculateUrl(String pathKey) {
  159. return pathKey;
  160. }
  161. public String calculateUrl(String bucket, String pathKey) {
  162. String host = ossProperties.getHostByBucket(bucket);
  163. return host + "/" + pathKey;
  164. }
  165. public String calculatePathKey(String url) {
  166. String urlPath = InnerUtils.getUrlPath(url);
  167. if (urlPath != null && urlPath.startsWith("/")) {
  168. String pathKey = urlPath.substring(1);
  169. if (pathKey.length() > 0) {
  170. return InnerUtils.decodeUrl(pathKey);
  171. }
  172. }
  173. return null;
  174. }
  175. public String calculateHost(String endpoint, String bucket) {
  176. return InnerUtils.generateHost(endpoint, bucket);
  177. }
  178. @Override
  179. public Boolean copyObject(String oldPath, String newPath) {
  180. return copyObject(ossProperties.getBucket(), oldPath, ossProperties.getBucket(), newPath);
  181. }
  182. @Override
  183. public Boolean copyObject(String bucket, String oldPath, String toBucket, String newPath) {
  184. AliyunOssTemplate.log.info("拷贝开始:oldBucket={},oldPath={},newBucket={},newPath={}", bucket, oldPath, toBucket, newPath);
  185. String versionId = ossClient.copyObject(bucket, oldPath, toBucket, newPath).getVersionId();
  186. return StrUtil.isNotBlank(versionId);
  187. }
  188. @Override
  189. public void deleteObject(String keyName) {
  190. if (!doesObjectExist(keyName)) {
  191. deleteObject(ossProperties.getBucket(), keyName);
  192. } else {
  193. AliyunOssTemplate.log.warn("文件不存在,KeyName{}", keyName);
  194. }
  195. }
  196. @Override
  197. public void deleteObject(String bucket, String keyName) {
  198. ossClient.deleteObject(bucket, keyName);
  199. }
  200. @Override
  201. public List<String> getFileFolder(String keyName) {
  202. return getFileFolder(ossProperties.getBucket(), keyName);
  203. }
  204. @Override
  205. public List<String> getFileFolder(String bucket, String keyName) {
  206. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossProperties.getBucket());
  207. // 设置正斜线(/)为文件夹的分隔符。
  208. listObjectsRequest.setDelimiter("/");
  209. // 设置prefix参数来获取fun目录下的所有文件。
  210. if (!StringUtils.isEmpty(keyName)) {
  211. listObjectsRequest.setPrefix(keyName + "/");
  212. }
  213. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  214. // 遍历所有commonPrefix
  215. List<String> list = new ArrayList<>();
  216. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  217. list.add(objectSummary.getKey());
  218. }
  219. AliyunOssTemplate.log.info("获取文件夹集合={}", JSON.toJSONString(list));
  220. return list;
  221. }
  222. @Override
  223. public boolean doesObjectExist(String bucket, String keyName) {
  224. boolean b = ossClient.doesObjectExist(bucket, keyName);
  225. AliyunOssTemplate.log.info("文件是否存在={}", b);
  226. return b;
  227. }
  228. @Override
  229. public boolean doesObjectExist(String keyName) {
  230. return doesObjectExist(ossProperties.getBucket(), keyName);
  231. }
  232. @Override
  233. public String uploadFileImage(String pathKey, String filePath) {
  234. return uploadFileImage(ossProperties.getBucket(), pathKey, filePath);
  235. }
  236. @Override
  237. public String uploadFileImage(String bucket, String pathKey, String filePath) {
  238. ObjectMetadata metadata = new ObjectMetadata();
  239. if (filePath.contains(".jpg")) {
  240. metadata.setContentType("image/jpeg");
  241. } else if (filePath.contains(".png")) {
  242. metadata.setContentType("image/png");
  243. }
  244. AliyunOssTemplate.log.info("上传开始:上传bucket={},上传pathKey={},上传filePath={}", bucket, pathKey, filePath);
  245. ossClient.putObject(bucket, pathKey, new File(filePath), metadata);
  246. return calculateUrl(bucket, pathKey);
  247. }
  248. }