華爲雲的obs之自定義springboot-starter

華爲雲的obs如果自己調用api的話,接口太多,很多不需要,依賴也很多(需要調用好幾個jar包)。於是想着自己給封裝下,引一個jar就能用多好啊。於是自己利用業餘時間自定義了這個starer,可以快速投入開發,省時省力,希望幫助到大家。

一、自定義的starter封裝好的幾個常用方法:

一.桶的操作

  • 查詢所有桶
  • 桶的新增
  • 桶的刪除
  • 設置桶內文件對象過期時間

二.對象的操作

  • 1.查詢某個桶的所有對象
  • 2.上傳某個對象(全局訪問權限版2個)(通過流+通過file對象)
  • 3.上傳某個對象(設置對象自定義元數據版)
  • 4.獲取某個對象的所有信息
  • 5.獲取某個對象的元數據
  • 6.獲取某個對象的流
  • 7.拷貝對象
  • 8.刪除單個對象
  • 9.下載某個對象到本地

三.文件夾的操作

  • 1.創建文件夾
  • 2.判斷對象是否是文件夾
  • 3.列舉文件夾中的所有對象
  • 4.刪除某個文件夾下的所有對象

二、springboot(華爲雲的obs)的starter核心工具類代碼

/**
 * Title: ObsUtils
 * Description: obs操作工具類
 *
 * @author hfl
 * @version V1.0
 * @date 2020-05-27
 */
public class ObsService {
    private final static Logger logger = LoggerFactory.getLogger(ObsService.class);

    private ObsClient obsClient;
    private String bucketName;
    private String bucketLoc;
    private ObsConfiguration config;

    public ObsService() {
    }

    public ObsService(String bucketName, String bucketLoc, ObsConfiguration config) {
        this.bucketName = bucketName;
        this.bucketLoc = bucketLoc;
        this.config = config;
    }

    /**
     * 查詢所有桶
     *
     * @return 桶的列表
     */
    @ObsClientAnnotation
    public List<ObsBucket> listBuckets() {
        ListBucketsRequest request = new ListBucketsRequest();
        request.setQueryLocation(true);
        List<ObsBucket> obsBuckets = obsClient.listBuckets(request);
        return obsBuckets;
    }

    /**
     * 桶的新增
     *
     * @param bucketName 桶的名稱
     * @return 桶對象信息
     */
    @ObsClientAnnotation
    public ObsBucket createBucket(String bucketName) {
        ObsBucket obsBucket = new ObsBucket(bucketName, bucketLoc);
        obsBucket.setBucketName(bucketName);
        return obsClient.createBucket(obsBucket);
    }

    /**
     * 桶的刪除
     *
     * @param bucketName 桶的名稱
     * @return 響應對象
     */
    @ObsClientAnnotation
    public HeaderResponse deleteBucket(String bucketName) {
        return obsClient.deleteBucket(bucketName);
    }

    /**
     * 設置桶內指定前綴的文件對象 過期時間
     *
     * @param prefix         什麼前綴的文件過期(比如/tmp)
     * @param expirationDays 幾天後過期
     */
    @ObsClientAnnotation
    public HeaderResponse setLiftConfig(String prefix, Integer expirationDays) {
        LifecycleConfiguration config = new LifecycleConfiguration();
        LifecycleConfiguration.Rule rule = config.new Rule();
        rule.setEnabled(true);
        //過期規則名稱
        rule.setId(String.valueOf(UUID.randomUUID()));
        rule.setPrefix(prefix);
        LifecycleConfiguration.Expiration expiration = config.new Expiration();
        // 指定滿足前綴的對象創建x天后過期
        expiration.setDays(expirationDays);
        LifecycleConfiguration.NoncurrentVersionExpiration noncurrentVersionExpiration = config.new NoncurrentVersionExpiration();
        // 指定滿足前綴的對象成爲歷史版本x天后過期
        noncurrentVersionExpiration.setDays(expirationDays);
        rule.setNoncurrentVersionExpiration(noncurrentVersionExpiration);
        config.addRule(rule);
        return obsClient.setBucketLifecycle(bucketName, config);
    }

    /**
     * 查詢桶的所有對象
     *
     * @return 桶內對象集合(關鍵屬性getObjectKey)
     */
    @ObsClientAnnotation
    public ObjectListing listObjects() {
        ObjectListing listing = obsClient.listObjects(bucketName);
        return listing;
    }

    /**
     * 上傳對象時指定預定義訪問策略爲公共讀(很重要)
     *
     * @param objectKey   對象的key
     * @param inputStream 要上傳的文件流
     * @return 響應對象
     */
    @ObsClientAnnotation
    public PutObjectResult putObjectAndSetPreAccessStrategy(String objectKey, InputStream inputStream) {
        PutObjectRequest request = new PutObjectRequest();
        request.setBucketName(bucketName);
        //對象的key 如:  objectname1/text
        request.setObjectKey(objectKey);
        request.setInput(inputStream);
        //設置對象訪問權限爲公共讀
        request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
        return obsClient.putObject(request);
    }

    /**
     * 上傳對象時指定預定義訪問策略爲公共讀(很重要)
     *
     * @param objectKey   對象的key
     * @param file 要上傳的文件
     * @return 響應對象
     */
    @ObsClientAnnotation
    public PutObjectResult putObjectAndSetPreAccessStrategy(String objectKey, File file) {
        PutObjectRequest request = new PutObjectRequest();
        request.setBucketName(bucketName);
        //對象的key 如:  objectname1/text
        request.setObjectKey(objectKey);
        request.setFile(file);
        //設置對象訪問權限爲公共讀
        request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
        return obsClient.putObject(request);
    }

    /**
     * 上傳某個對象並設置對象自定義元數據
     *
     * @param objectKey   要上傳的key
     * @param metadata    元數據對象
     * @param inputStream 要上傳的文件流
     * @return 上傳結果
     * //  ObjectMetadata metadata = new ObjectMetadata();
     * //  metadata.addUserMetadata("property1", "property-value1");
     * //  metadata.getMetadata().put("property2", "property-value2");
     * //  C:\\Users\\hufanglei\\Pictures\\timg.jpg"
     */
    @ObsClientAnnotation
    public PutObjectResult putObjectAndSetMeta(String objectKey, ObjectMetadata metadata, InputStream inputStream) {
        return obsClient.putObject(bucketName, objectKey, inputStream, metadata);
    }

    /**
     * 獲取某個對象
     *
     * @param objectKey 對象的key
     * @return 對象的信息
     */
    @ObsClientAnnotation
    public ObsObject getObject(String objectKey) {
        return obsClient.getObject(bucketName, objectKey, null);
    }

    /**
     * 獲取某個對象的流
     *
     * @param objectKey 對象的key
     * @return 對象的流
     */
    @ObsClientAnnotation
    public InputStream getObjectInpuStream(String objectKey) {
        ObsObject obsObject = obsClient.getObject(bucketName, objectKey, null);
        return obsObject.getObjectContent();
    }

    /**
     * 查詢對象元數據(查詢某個對象的具體信息)
     *
     * @param objectKey 要查詢的key
     * @return 對象元數據
     */
    @ObsClientAnnotation
    public ObjectMetadata getObjectMetadata(String objectKey) {
        //獲取對象元數據
        return obsClient.getObjectMetadata(bucketName, objectKey, null);
    }

    /**
     * 拷貝對象(也可以從一個桶拷貝到另一個桶,這裏目前桶和原始文件桶都設置成了配置文件中的桶)
     *
     * @param sourceObjectKey 原始key
     * @param destObjectKey   目標key
     * @return 響應結果
     */
    @ObsClientAnnotation
    public CopyObjectResult copyObject(String sourceObjectKey, String destObjectKey) {
        String sourceBucketName = bucketName;
        String destBucketName = bucketName;
        return obsClient.copyObject(sourceBucketName, sourceObjectKey, destBucketName, destObjectKey);
    }

    /**
     * 刪除單個對象
     *
     * @param objectKey 要刪除的key
     * @return 響應結果
     */
    @ObsClientAnnotation
    public DeleteObjectResult deletObj(String objectKey) {
        return obsClient.deleteObject(bucketName, objectKey);
    }
    /**
     * 下載某個對象到本地
     *
     * @param objectKey     對象的key
     * @param localFilePath 本地文件路徑
     * @throws ObsException
     * @throws IOException
     */
    @ObsClientAnnotation
    public void downloadToLocalFile(String objectKey, String localFilePath) throws ObsException, IOException {
        File localFile = new File(localFilePath);
        if (!localFile.getParentFile().exists()) {
            localFile.getParentFile().mkdirs();
        }
        ObsObject obsObject = obsClient.getObject(bucketName, objectKey, null);
        ReadableByteChannel rchannel = Channels.newChannel(obsObject.getObjectContent());
        ByteBuffer buffer = ByteBuffer.allocate(4096);
        WritableByteChannel wchannel = Channels.newChannel(new FileOutputStream(new File(localFilePath)));
        while (rchannel.read(buffer) != -1) {
            buffer.flip();
            wchannel.write(buffer);
            buffer.clear();
        }
        rchannel.close();
        wchannel.close();
    }

    /**
     * 創建一個文件夾,必須帶有/後綴
     *
     * @param keySuffixWithSlash1 文件夾名稱(必須帶有/後綴)
     * @return 響應對象
     */
    @ObsClientAnnotation
    public PutObjectResult createEmptyFolder(String keySuffixWithSlash1) {
        return obsClient.putObject(bucketName, keySuffixWithSlash1, new ByteArrayInputStream(new byte[0]));
    }


    /**
     * 判斷對象是否是文件夾
     * @param keySuffixWithSlash1 文件夾名: 如:   "MyObjectKey1/"
     * @return 布爾值
     */
    @ObsClientAnnotation
    public boolean isEmptyFolder(String keySuffixWithSlash1)  {
        ObsObject object = obsClient.getObject(bucketName, keySuffixWithSlash1, null);
        if (object != null) {
            return object.getMetadata().getContentLength() == 0L;
        }
        return false;
    }

    /**
     * 列舉某個文件夾下的所有對象
     *
     * @param folderPrefix 件夾名(必須/結尾)
     * @return 對象集合
     */
    @ObsClientAnnotation
    public ObjectListing listObjectsByFolder(String folderPrefix) {
        ListObjectsRequest request = new ListObjectsRequest(bucketName);
        // 設置文件夾對象名"dir/"爲前綴
        // request.setPrefix("dir/");
        request.setPrefix(folderPrefix);
        //列舉文件個數
        request.setMaxKeys(1000);
        ObjectListing result;
        do {
            result = obsClient.listObjects(request);
            for (ObsObject obsObject : result.getObjects()) {
                logger.info("\t" + obsObject.getObjectKey());
                logger.info("\t" + obsObject.getOwner());
            }
            request.setMarker(result.getNextMarker());
        } while (result.isTruncated());
        return result;
    }

    /**
     * 刪除某個文件夾下的所有對象
     *
     * @param folderPrefix 文件夾名(必須/結尾)
     * @return 是否刪除成功
     */
    @ObsClientAnnotation
    public boolean deleteListObjectsByFolder(String folderPrefix) {
        ListObjectsRequest request = new ListObjectsRequest(bucketName);
        // 設置文件夾對象名"/xx/xxx/"爲前綴
        request.setPrefix(folderPrefix);
        //列舉文件個數
        request.setMaxKeys(1000);
        ObjectListing result;
        do {
            result = obsClient.listObjects(request);
            for (ObsObject obsObject : result.getObjects()) {
                logger.info("\t" + obsObject.getObjectKey());
                logger.info("\t" + obsObject.getOwner());
                //執行刪除
                obsClient.deleteObject(bucketName, obsObject.getObjectKey());
            }
            request.setMarker(result.getNextMarker());
        } while (result.isTruncated());
        return true;
    }
}

三、如何使用starter

0.前提 請注意

  • obs的jar包在maven倉庫的版本很老了,所以去官網下載比較新的jar包。
  • 需要將esdk-obs-java-3.19.11.1.jar加載進依賴或者上傳到私服,我已經上傳到自己的私服了,直接引pom即可,直接使用會報錯
  • 如果報錯,請手動添加放在/obs-upload-spring-boot-starter/doc/lib下esdk-obs-java-3.19.11.1.jar

使用步驟1.引入自定義obs的starter

<dependency>
    <groupId>com.wuzheng</groupId>
    <artifactId>obs-upload-spring-boot-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

使用步驟2.配置文件設置參數

obs:
  #端點(xx和地區對應)
  endPoint: http://obs.xxx.myhuaweicloud.com
  ak: yourself ak
  sk: yourslef sk
  bucketName: yourself 桶的名字
  #地區
  bucketLoc: xxx

使用步驟3.在springboot的啓動類上加上啓動註解

 @EnableObsAutoConfiguration

項目中調用示例

@Service
public class UserService {
    @Autowired
    private ObsService obsService;


   //以上傳爲例:其他方法看上面的接口列表
    public static void obsUp() {
        String objectKey = "XX";
        File file = new File("XXXX");
        obsService.putObjectAndSetPreAccessStrategy(objectKey,  file);        
    }

四、springboot(華爲雲的obs)starter開源項目地址

https://gitee.com/hufanglei/obs-upload-spring-boot-starter


個人微信公衆號:
搜索: 怒放de每一天
不定時推送相關文章,期待和大家一起成長!!
在這裏插入圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章