HuaweiOBSUtils.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package edu.travel.upload.obs;
  2. import com.obs.services.ObsClient;
  3. import com.obs.services.exception.ObsException;
  4. import com.obs.services.internal.ServiceException;
  5. import com.obs.services.model.*;
  6. import edu.travel.upload.obs.property.ObsProperties;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  11. import org.springframework.stereotype.Component;
  12. import java.io.ByteArrayInputStream;
  13. import java.io.IOException;
  14. import java.io.InputStream;
  15. import java.security.MessageDigest;
  16. import java.security.NoSuchAlgorithmException;
  17. import java.util.Base64;
  18. import java.util.Optional;
  19. @Component
  20. @ConditionalOnClass(ObsClient.class)
  21. public class HuaweiOBSUtils {
  22. Logger log = LoggerFactory.getLogger(HuaweiOBSUtils.class);
  23. @Autowired
  24. private ObsClient obsClient;
  25. @Autowired
  26. private ObsProperties obsProperties;
  27. //注意这里传进来的参数是处理后的图片 base64 参数,处理方法只需要调用 api,这里不做过多解释,可以上网查询转换方法,另外是指定的文件名称和bucket名称,上传后的文件将是以该 fileName 存在于该bucket 内
  28. //此方法是用于上传文件,内部调用了 obs 的含有 MD5 参数校验的api方法
  29. public void uploadPic(String base64, String fileName) {
  30. byte[] bytes = Base64.getDecoder().decode(base64);
  31. ObjectMetadata meta = new ObjectMetadata();
  32. // 设置MD5校验。
  33. String md5 = toBase64String(calculateMd5(bytes));
  34. meta.setContentMd5(md5);
  35. try (InputStream inputStream = new ByteArrayInputStream(bytes)) {
  36. PutObjectResult result = obsClient.putObject(obsProperties.getBucketName(), fileName, inputStream,meta);
  37. } catch (Exception e) {
  38. log.error("Upload failed: ", e);
  39. }
  40. }
  41. // 计算 MD5 值的方法
  42. private static byte[] calculateMd5(byte[] data) {
  43. try {
  44. MessageDigest md = MessageDigest.getInstance("MD5");
  45. return md.digest(data);
  46. } catch (NoSuchAlgorithmException e) {
  47. throw new RuntimeException("MD5 algorithm not found.", e);
  48. }
  49. }
  50. // 将字节数组转换为 Base64 编码的字符串
  51. private static String toBase64String(byte[] bytes) {
  52. return Base64.getEncoder().encodeToString(bytes);
  53. }
  54. //该方法是用于检查bucket 内是否有指定文件,内部调用了 obs 的获取文件方法
  55. public Boolean checkExist(String fileName,String bucketName) {
  56. ObsObject object = null;
  57. InputStream inputStream = null;
  58. try {
  59. object = obsClient.getObject(bucketName, fileName);
  60. inputStream = object.getObjectContent();
  61. if (inputStream != null) {
  62. return true;
  63. }
  64. } catch (Exception e) {
  65. log.error("请求异常:{}", fileName, e);
  66. return false;
  67. } finally {
  68. // 确保关闭 InputStream
  69. try {
  70. if (inputStream != null) {
  71. inputStream.close();
  72. }
  73. } catch (IOException e) {
  74. log.error("关闭 InputStream 异常", e);
  75. }
  76. }
  77. return false;
  78. }
  79. //该方法是用于获取指定时间内的文件下载链接
  80. public String getPicViewUrlByInternal(String fileName) {
  81. Boolean aBoolean = checkExist(fileName,obsProperties.getBucketName());
  82. if (!aBoolean) {
  83. return null;
  84. }
  85. // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
  86. String url = generatePresignedUrl(obsProperties.getExpiration(), fileName,obsProperties.getBucketName());
  87. return url;
  88. }
  89. private String generatePresignedUrl(Long expire,String fileName,String bucketName) {
  90. TemporarySignatureResponse response = null;
  91. try {
  92. // URL有效期,3600秒
  93. //long expireSeconds = 3600L;
  94. TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expire);
  95. request.setBucketName(bucketName);
  96. request.setObjectKey(fileName);
  97. response = obsClient.createTemporarySignature(request);
  98. } catch (ObsException e) {
  99. log.error("get obs failed :{}", e.getMessage());
  100. throw new ServiceException(e.getMessage());
  101. }
  102. return Optional.ofNullable(response)
  103. .map(TemporarySignatureResponse::getSignedUrl)
  104. .orElse(null);
  105. }
  106. }