当前位置:   article > 正文

云存储解决方案-华为云OBS存储服务案例_slf4j配置华为云obs

slf4j配置华为云obs

需求


我们在日常的业务需求中,会大量的遇到视频,图片,文件等等的存储需求,目前接触到工具有:minio,obs,ftp等等。

本文主要介绍:华为云对象存储服务(Object Storage Service,简称OBS)为您提供基于网络的数据存取服务。使用OBS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。

步骤

1.开通obs并官方文档配置obs。
2.参考官方api,在springboot集成obs。

一、开通obs并官方文档配置obs

登录华为云官网,在产品标签处直接搜索obs。

 具体购买流程和购买后的配置请参考文档:

https://support.huaweicloud.com/sdk-java-devg-obs/obs_21_0001.html
华为云官方文档


二、springboot集成obs

1.创建测试工程,引入依赖。


2.在springBoot中集成OBS。

将密钥、 地址、桶名配置到application-dev.yml文件中,方便后期的更改。

创建对应的配置文件中华为账户对应的实体类。

分离出初始化obs方法。

结合官方文档封装自己的obs工具类。

  1. package com.richstonedt.smartcity.xaytsccommoncs.util;
  2. import com.obs.services.ObsClient;
  3. import com.obs.services.ObsConfiguration;
  4. import com.obs.services.exception.ObsException;
  5. import com.obs.services.internal.ObsService;
  6. import com.obs.services.model.*;
  7. import com.richstonedt.smartcity.xaytsccommoncs.annotation.ObsClientAnnotation;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import java.io.*;
  11. import java.nio.ByteBuffer;
  12. import java.nio.channels.Channels;
  13. import java.nio.channels.ReadableByteChannel;
  14. import java.nio.channels.WritableByteChannel;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.UUID;
  19. /**
  20.  * <b><code>ObsUtil</code></b>
  21.  * <p/>
  22.  * Description OBS工具类
  23.  * <p/>
  24.  * <b>Creation Time:</b> 2022/3/29 15:56:45
  25.  *
  26.  * @author tangjiahuan
  27.  * @since xaytsc-common-be
  28.  */
  29. public class ObsUtil {
  30.     private final static Logger logger = LoggerFactory.getLogger(ObsService.class);
  31.     private ObsClient obsClient;
  32.     private String bucketName;
  33.     private String bucketLoc;
  34.     private ObsConfiguration config;
  35.     public ObsUtil() {
  36.     }
  37.     public ObsUtil(String bucketName, String bucketLoc, ObsConfiguration config) {
  38.         this.bucketName = bucketName;
  39.         this.bucketLoc = bucketLoc;
  40.         this.config = config;
  41.     }
  42.     public ObsUtil( String bucketLoc, ObsConfiguration config) {
  43.         this.bucketLoc = bucketLoc;
  44.         this.config = config;
  45.     }
  46.     /**
  47.      * 查询所有桶
  48.      *
  49.      * @return 桶的列表
  50.      */
  51. //    @ObsClientAnnotation
  52.     public List<ObsBucket> listBuckets() {
  53.         ListBucketsRequest request = new ListBucketsRequest();
  54.         request.setQueryLocation(true);
  55.         List<ObsBucket> buckets = obsClient.listBuckets(request);
  56.         return buckets;
  57.     }
  58.     /**
  59.      * 桶的新增
  60.      *
  61.      * @param bucketName 桶的名称
  62.      * @return 桶对象信息
  63.      */
  64. //    @ObsClientAnnotation
  65.     public ObsBucket createBucket(String bucketName) {
  66.         ObsBucket obsBucket = new ObsBucket(bucketName, bucketLoc);
  67.         obsBucket.setBucketName(bucketName);
  68.         return obsClient.createBucket(obsBucket);
  69.     }
  70.     /**
  71.      * 桶的删除
  72.      *
  73.      * @param bucketName 桶的名称
  74.      * @return 响应对象
  75.      */
  76. //    @ObsClientAnnotation
  77.     public HeaderResponse deleteBucket(String bucketName) {
  78.         return obsClient.deleteBucket(bucketName);
  79.     }
  80.     /**
  81.      * 设置桶内指定前缀的文件对象 过期时间
  82.      *
  83.      * @param prefix         什么前缀的文件过期(比如/tmp)
  84.      * @param expirationDays 几天后过期
  85.      */
  86.     @ObsClientAnnotation
  87.     public HeaderResponse setLiftConfig(String prefix, Integer expirationDays) {
  88.         LifecycleConfiguration config = new LifecycleConfiguration();
  89.         LifecycleConfiguration.Rule rule = config.new Rule();
  90.         rule.setEnabled(true);
  91.         //过期规则名称
  92.         rule.setId(String.valueOf(UUID.randomUUID()));
  93.         rule.setPrefix(prefix);
  94.         LifecycleConfiguration.Expiration expiration = config.new Expiration();
  95.         // 指定满足前缀的对象创建x天后过期
  96.         expiration.setDays(expirationDays);
  97.         LifecycleConfiguration.NoncurrentVersionExpiration noncurrentVersionExpiration = config.new NoncurrentVersionExpiration();
  98.         // 指定满足前缀的对象成为历史版本x天后过期
  99.         noncurrentVersionExpiration.setDays(expirationDays);
  100.         rule.setNoncurrentVersionExpiration(noncurrentVersionExpiration);
  101.         config.addRule(rule);
  102.         return obsClient.setBucketLifecycle(bucketName, config);
  103.     }
  104.     /**
  105.      * 查询桶的所有对象
  106.      *
  107.      * @return 桶内对象集合(关键属性getObjectKey)
  108.      */
  109. //    @ObsClientAnnotation
  110.     public ObjectListing listObjects() {
  111.         ObjectListing objects = obsClient.listObjects(bucketName);
  112.         return objects;
  113.     }
  114.     /**
  115.      * 上传对象时指定预定义访问策略为公共读(很重要)
  116.      *
  117.      * @param objectKey   对象的key
  118.      * @param inputStream 要上传的文件流
  119.      * @return 响应对象
  120.      */
  121. //    @ObsClientAnnotation
  122.     public PutObjectResult putObjectAndSetPreAccessStrategy(String objectKey, InputStream inputStream) {
  123.         PutObjectRequest request = new PutObjectRequest();
  124.         request.setBucketName(bucketName);
  125.         //对象的key 如:  objectname1/text
  126.         request.setObjectKey(objectKey);
  127.         request.setInput(inputStream);
  128.         //设置对象访问权限为公共读
  129.         request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
  130.         return obsClient.putObject(request);
  131.     }
  132.     /**
  133.      * 上传对象时指定预定义访问策略为公共读(很重要)
  134.      * @param isImage 是否为图片
  135.      * @param objectKey   对象的key
  136.      * @param file 要上传的文件
  137.      * @return 响应对象
  138.      */
  139. //    @ObsClientAnnotation
  140.     public PutObjectResult putObjectAndSetPreAccessStrategy(String objectKey, File file,Integer isImage) {
  141.         PutObjectRequest request = new PutObjectRequest();
  142.         request.setBucketName(bucketName);
  143.         //对象的key 如:  objectname1/text
  144.         request.setObjectKey(objectKey);
  145.         request.setFile(file);
  146.         //设置元数据 isImage  0:1:文件
  147.         ObjectMetadata metadata = new ObjectMetadata();
  148.         metadata.addUserMetadata("isImage", isImage.toString());
  149.         request.setMetadata(metadata);
  150.         //图片设置为公共读
  151.        /* if(isImage == 0){
  152.             //设置对象访问权限为公共读
  153.             request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
  154.         }*/
  155.         return obsClient.putObject(request);
  156.     }
  157.     /**
  158.      * 上传某个对象并设置对象自定义元数据
  159.      *
  160.      * @param objectKey   要上传的key
  161.      * @param metadata    元数据对象
  162.      * @param inputStream 要上传的文件流
  163.      * @return 上传结果
  164.      * //  ObjectMetadata metadata = new ObjectMetadata();
  165.      * //  metadata.addUserMetadata("property1", "property-value1");
  166.      * //  metadata.getMetadata().put("property2", "property-value2");
  167.      * //  C:\\Users\\hufanglei\\Pictures\\timg.jpg"
  168.      */
  169. //    @ObsClientAnnotation
  170.     public PutObjectResult putObjectAndSetMeta(String objectKey, ObjectMetadata metadata, InputStream inputStream) {
  171.         return obsClient.putObject(bucketName, objectKey, inputStream, metadata);
  172.     }
  173.     /**
  174.      * 获取某个对象
  175.      *
  176.      * @param objectKey 对象的key
  177.      * @return 对象的信息
  178.      */
  179. //    @ObsClientAnnotation
  180.     public ObsObject getObject(String objectKey) {
  181.         return obsClient.getObject(bucketName, objectKey, null);
  182.     }
  183.     /**
  184.      * 获取某个对象的流
  185.      *
  186.      * @param objectKey 对象的key
  187.      * @return 对象的流
  188.      */
  189. //    @ObsClientAnnotation
  190.     public InputStream getObjectInpuStream(String objectKey) {
  191.         ObsObject obsObject = obsClient.getObject(bucketName, objectKey, null);
  192.         return obsObject.getObjectContent();
  193.     }
  194.     /**
  195.      * 查询对象元数据(查询某个对象的具体信息)
  196.      *
  197.      * @param objectKey 要查询的key
  198.      * @return 对象元数据
  199.      */
  200. //    @ObsClientAnnotation
  201.     public ObjectMetadata getObjectMetadata(String objectKey) {
  202.         //获取对象元数据
  203.         return obsClient.getObjectMetadata(bucketName, objectKey, null);
  204.     }
  205.     /**
  206.      * 拷贝对象(也可以从一个桶拷贝到另一个桶,这里目前桶和原始文件桶都设置成了配置文件中的桶)
  207.      *
  208.      * @param sourceObjectKey 原始key
  209.      * @param destObjectKey   目标key
  210.      * @return 响应结果
  211.      */
  212. //    @ObsClientAnnotation
  213.     public CopyObjectResult copyObject(String sourceObjectKey, String destObjectKey) {
  214.         String sourceBucketName = bucketName;
  215.         String destBucketName = bucketName;
  216.         return obsClient.copyObject(sourceBucketName, sourceObjectKey, destBucketName, destObjectKey);
  217.     }
  218.     /**
  219.      * 删除单个对象
  220.      *
  221.      * @param objectKey 要删除的key
  222.      * @return 响应结果
  223.      */
  224. //    @ObsClientAnnotation
  225.     public DeleteObjectResult deletObj(String objectKey) {
  226.         return obsClient.deleteObject(bucketName, objectKey);
  227.     }
  228.     /**
  229.      * 删除 对象
  230.      * @param objectKey 对象key
  231.      * @return 是否删除成功
  232.      */
  233.     public boolean deleteObject(String objectKey){
  234.         if(obsClient.doesObjectExist(bucketName,objectKey)){
  235.             obsClient.deleteObject(bucketName,objectKey);
  236.             return true;
  237.         }
  238.         return false;
  239.     }
  240.     public boolean isExistObject(String bucketName,String objectKey){
  241.        return obsClient.doesObjectExist(bucketName,objectKey);
  242.     }
  243.     /**
  244.      * 下载某个对象到本地
  245.      *
  246.      * @param objectKey     对象的key
  247.      * @param localFilePath 本地文件路径
  248.      * @throws ObsException
  249.      * @throws IOException
  250.      */
  251. //    @ObsClientAnnotation
  252.     public void downloadToLocalFile(String objectKey, String localFilePath) throws ObsException, IOException {
  253.         File localFile = new File(localFilePath);
  254.         if (!localFile.getParentFile().exists()) {
  255.             localFile.getParentFile().mkdirs();
  256.         }
  257.         ObsObject obsObject = obsClient.getObject(bucketName, objectKey, null);
  258.         ReadableByteChannel rchannel = Channels.newChannel(obsObject.getObjectContent());
  259.         ByteBuffer buffer = ByteBuffer.allocate(4096);
  260.         WritableByteChannel wchannel = Channels.newChannel(new FileOutputStream(new File(localFilePath)));
  261.         while (rchannel.read(buffer) != -1) {
  262.             buffer.flip();
  263.             wchannel.write(buffer);
  264.             buffer.clear();
  265.         }
  266.         rchannel.close();
  267.         wchannel.close();
  268.     }
  269.     /**
  270.      * 创建一个文件夹,必须带有/后缀
  271.      *
  272.      * @param keySuffixWithSlash1 文件夹名称(必须带有/后缀)
  273.      * @return 响应对象
  274.      */
  275. //    @ObsClientAnnotation
  276.     public PutObjectResult createEmptyFolder(String bucketName,String keySuffixWithSlash1) {
  277.         return obsClient.putObject(bucketName, keySuffixWithSlash1, new ByteArrayInputStream(new byte[0]));
  278.     }
  279.     /**
  280.      * 判断对象是否是文件夹
  281.      * @param keySuffixWithSlash1 文件夹名: 如:   "MyObjectKey1/"
  282.      * @return 布尔值
  283.      */
  284. //    @ObsClientAnnotation
  285.     public boolean isEmptyFolder(String keySuffixWithSlash1)  {
  286.         ObsObject object = obsClient.getObject(bucketName, keySuffixWithSlash1, null);
  287.         if (object != null) {
  288.             return object.getMetadata().getContentLength() == 0L;
  289.         }
  290.         return false;
  291.     }
  292.     /**
  293.      * 列举某个文件夹下的所有对象
  294.      *
  295.      * @param folderPrefix 件夹名(必须/结尾)
  296.      * @return 对象集合
  297.      */
  298. //    @ObsClientAnnotation
  299.     public ObjectListing listObjectsByFolder(String folderPrefix) {
  300.         ListObjectsRequest request = new ListObjectsRequest(bucketName);
  301.         // 设置文件夹对象名"dir/"为前缀
  302.         // request.setPrefix("dir/");
  303.         request.setPrefix(folderPrefix);
  304.         //列举文件个数
  305.         request.setMaxKeys(1000);
  306.         ObjectListing result;
  307.         do {
  308.             result = obsClient.listObjects(request);
  309.             for (ObsObject obsObject : result.getObjects()) {
  310.                 logger.info("\t" + obsObject.getObjectKey());
  311.                 logger.info("\t" + obsObject.getOwner());
  312.             }
  313.             request.setMarker(result.getNextMarker());
  314.         } while (result.isTruncated());
  315.         return result;
  316.     }
  317.     /**
  318.      * 删除某个文件夹下的所有对象
  319.      *
  320.      * @param folderPrefix 文件夹名(必须/结尾)
  321.      * @return 是否删除成功
  322.      */
  323. //    @ObsClientAnnotation
  324.     public boolean deleteListObjectsByFolder(String folderPrefix) {
  325.         ListObjectsRequest request = new ListObjectsRequest(bucketName);
  326.         // 设置文件夹对象名"/xx/xxx/"为前缀
  327.         request.setPrefix(folderPrefix);
  328.         //列举文件个数
  329.         request.setMaxKeys(1000);
  330.         ObjectListing result;
  331.         do {
  332.             result = obsClient.listObjects(request);
  333.             for (ObsObject obsObject : result.getObjects()) {
  334.                 logger.info("\t" + obsObject.getObjectKey());
  335.                 logger.info("\t" + obsObject.getOwner());
  336.                 //执行删除
  337.                 obsClient.deleteObject(bucketName, obsObject.getObjectKey());
  338.             }
  339.             request.setMarker(result.getNextMarker());
  340.         } while (result.isTruncated());
  341.         return true;
  342.     }
  343.     /**
  344.      * 批量删除
  345.      * @param objectKeys 文件key集合
  346.      * @param bucketName 桶名
  347.      * @return 删除结果
  348.      */
  349.     public DeleteObjectsResult deleteBatch(String bucketName,List<String> objectKeys){
  350.         DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest();
  351.         for (String key:objectKeys) {
  352.             deleteObjectsRequest.addKeyAndVersion(key);
  353.         }
  354.         deleteObjectsRequest.setBucketName(bucketName);
  355.         return obsClient.deleteObjects(deleteObjectsRequest);
  356.     }
  357.     public void outputErrorInfo(ObsException e){
  358.         logger.info("HTTP Code: " + e.getResponseCode());
  359.         logger.info("Error Code:" + e.getErrorCode());
  360.         logger.info("Error Message: " + e.getErrorMessage());
  361.         logger.info("Request ID:" + e.getErrorRequestId());
  362.         logger.info("Host ID:" + e.getErrorHostId());
  363.     }
  364. }

调用OBS工具类以及方法,将上传的文件传入到华为云OBS中。

上传obs成功后的资源如何如何访问。

测试​​​​​​​​​​​​​​

查看obs中是否上传成功。

查看obs上传成功后的返回地址是否可以访问。


- End-
收藏点赞转发,是对我最大的鼓励。您的支持就是我坚持下去的最大动力!

另外我的公众号也在同步更新文章。后续会更新SpringCloud alibaba开发实战、Elasticsearch+Logstash+Kibana实战、nginx+ssl+域名实战、日常开发问题闭坑集锦等等....


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/604109
推荐阅读
相关标签
  

闽ICP备14008679号