oss文件操作(文件列举、文件大小)

2023-12-24 23:21:05

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。


一、介绍

oss对象存储可以存储各类型数据,更加灵活,云端管理,安全高效,详细介绍可参考百度

官网地址:文件列举

官网对文件夹的说明:

  • OSS没有文件夹的概念,所有元素都是以文件来存储。创建文件夹本质上来说是创建了一个大小为0并以正斜线(/)结尾的文件。这个文件可以被上传和下载,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。关于创建文件夹的完整示例代码,请参见GitHub示例。
  • 通过delimiter和prefix两个参数可以模拟文件夹功能:
    – 如果设置prefix为某个文件夹名称,则会列举以此prefix开头的文件,即该文件夹下所有的文件和子文件夹(目录)均显示为objects。
    – 如果在设置了prefix的情况下,将delimiter设置为正斜线(/),则只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件夹(目录)显示为CommonPrefixes,子文件夹下的文件和文件夹不显示。
  • 注意: 默认列举数量为100个,如果文件夹中超过100,则只会列举前100个,想要列举更多,可以通过设置maxKeys参数的值,最大为1000

二、依赖

所使用的所有依赖如下

    <dependencies>
        <!--SpringBoot启动依赖-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-web</artifactId>-->
<!--            <version>2.6.3</version>-->
<!--        </dependency>-->
        <!--OSS依赖-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.32</version>
        </dependency>
    </dependencies>

三、实现

1. 连接参数

连接oss需要三个参数endpoint、accessKeyId、accessKeySecret

endpoint 服务器所在区域 如华东-上海 https://oss-cn-shanghai.aliyuncs.com
另外两个参数为服务的秘钥验证参数,需要在实例中查看获取
accessKeyId 如 UuSdeE9e89kEe4QG9rdfeDKeEDed98n
accessKeySecret 如 fMDdfDEGsdDfdY7F4CtvwDRFe4fe9DeERde834X

2. 列举文件

列举文件主要就两个方向,一个是文件夹,一个是文件,但文件夹也是文件,是带/的文件,大小为0
列举文件细分又分为:
列举桶即bucket的所有文件夹(单层,不向内继续列举)
列举桶即bucket的所有文件夹和文件(单层,不向内继续列举)
列举桶即bucket的所有文件(多层,子文件夹下如果还有文件夹则继续向内遍历列举)
列举指定文件夹下所有文件
列举指定文件夹下的所有文件夹及文件(文件夹下的子文件夹和文件不再进行列举)
列举指定文件夹下的所有文件夹(只列举文件夹,文件、子文件夹及其中的文件夹和文件都不列举)
描述起来不是很好描述,但只要自己找个oss文件夹跑一遍就一目了然了

注意: 默认列举数量为100个,如果文件夹中超过100,则只会列举前100个,想要列举更多,可以通过设置maxKeys参数的值,最大为1000
//设置最大列举数量 listObjectsRequest.setMaxKeys(1000);

2.1 列举bucket的所有文件夹(单层)

    /**
     * 列举指定桶的所有文件夹
     * @param bucketName 桶名称
     * @return 返回文件夹列表
     */
    public static List listBucketPackages(String bucketName){

        List packageList = new ArrayList();
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出桶目录下的所有文件和文件夹。此处为空即可
        listObjectsRequest.setPrefix("");
        //设置最大列举数量
        listObjectsRequest.setMaxKeys(1000);
        // 列举文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有commonPrefix。
        System.out.println("CommonPrefixes:");
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
            packageList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return packageList;
    }

2.2 列举指定bucket中的所有文件夹和文件(单层)

    /**
     * 列举指定桶的所有文件和文件夹
     * @param bucketName 桶名称
     * @return 返回文件和文件夹列表
     */
    public static List listBucketFileAndPackage(String bucketName){
        List packageList = new ArrayList();
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出桶目录下的所有文件和文件夹。此处为空即可
        listObjectsRequest.setPrefix("");
        //设置最大列举数量
        listObjectsRequest.setMaxKeys(1000);
        // 列举文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            packageList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("CommonPrefixes:");
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
            packageList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return packageList;
    }

2.3 列举指定bucket中的所有文件(多层)

    /**
     * 列举存储空间下的所有文件
     * @param bucketName 存储空间的桶名称
     * @return
     */
    public static List listAllFilesForBucket(String bucketName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 列举文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        List objList = new ArrayList();
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            objList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("CommonPrefixes:");
//        List comprefList = new ArrayList();
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
//            comprefList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        fileList.add(objList);
//        fileList.add(comprefList);
        return fileList;
    }

2.4 列举指定文件夹的所有文件(多层)

    /**
     * 列举指定目录下的所有文件(包含了子目录下的所有文件及子目录)
     * @param bucketName 桶名称
     * @param prefixName 指定目录的名称 如 fun/
     * @return 返回指定目录下的所有文件
     */
    public static List listAllFileByPrefix(String bucketName, String prefixName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置prefix参数来获取fun目录下的所有文件。
//            listObjectsRequest.setPrefix("fun/");
        listObjectsRequest.setPrefix(prefixName);
        // 递归列举fun目录下的所有文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            fileList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("\nCommonPrefixes:");
        for (String commonPrefix : listing.getCommonPrefixes()) {
//            System.out.println(commonPrefix);
//            fileList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return fileList;
    }

2.5 列举指定文件夹中的所有文件夹和文件(单层)

    /**
     * 列举文件夹下的文件夹及文件
     * 列举目录下的文件和子目录(只有一层,子目录下的子文件和子子目录不管)
     * @param bucketName 桶名称
     * @param prefixName 文件夹名称
     * @return 返回文件夹下所有文件和目录列表
     */
    public static List listAllFilesAndPackagesByPrefix(String bucketName, String prefixName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出fun目录下的所有文件和文件夹。
//            listObjectsRequest.setPrefix("fun/");
        listObjectsRequest.setPrefix(prefixName);
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        // objectSummaries的列表中给出的是fun目录下的文件。
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            fileList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("\nCommonPrefixes:");
        // commonPrefixs列表中显示的是fun目录下的所有子文件夹。由于fun/movie/001.avi和fun/movie/007.avi属于fun文件夹下的movie目录,因此这两个文件未在列表中。
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
            fileList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return fileList;
    }

2.6 列举指定bucket中的所有文件夹(单层)

    /**
     * 只列举文件夹下的所有文件夹
     * 列举目录下所有子目录(只有一层,子目录下的子文件和子子目录不管)
     * @param bucketName 桶名称
     * @param prefixName 文件夹名称
     * @return 返回文件夹下所有文件和目录列表
     */
    public static List listAllPackagesByPrefix(String bucketName, String prefixName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出fun目录下的所有文件和文件夹。
//            listObjectsRequest.setPrefix("fun/");
        listObjectsRequest.setPrefix(prefixName);
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有commonPrefix。
//        System.out.println("\nCommonPrefixes:");
        // commonPrefixs列表中显示的是fun目录下的所有子文件夹。由于fun/movie/001.avi和fun/movie/007.avi属于fun文件夹下的movie目录,因此这两个文件未在列表中。
        for (String commonPrefix : listing.getCommonPrefixes()) {
//            System.out.println(commonPrefix);
            fileList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return fileList;
    }

3. 文件大小计算

根据指定的桶名称和指定的文件夹来计算文件夹中所有文件的大小(即计算指定文件夹的大小)

    /**
     * 计算文件夹下所有文件大小
     * 通过GetBucket (ListObjects)方法获取指定目录下的文件大小
     * @param bucketName 桶名称
     * @param keyPrefix 所要计算的文件夹,后缀不加斜杠
     * @return 返回文件夹下文件大小
     */
    public static long fileSizeUtil(String bucketName, String keyPrefix){
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        long fileSize = 0;
        try {
            ObjectListing objectListing = null;
            do {
                // 默认情况下,每次列举100个文件或目录。
                ListObjectsRequest request = new ListObjectsRequest(bucketName).withDelimiter("/").withPrefix(keyPrefix);
                if (objectListing != null) {
                    request.setMarker(objectListing.getNextMarker());
                }
                objectListing = ossClient.listObjects(request);
//                objectListing = osscon.listObjects(request);
                List<String> folders = objectListing.getCommonPrefixes();
                for (String folder : folders) {
//                    System.out.println(folder + " fffffffffffffff: " + (calculateFolderLength(ossClient, bucketName, folder) / 1024) + "KB");
//                    System.out.println(folder + " : " + (calculateFolderLength(osscon, bucketName, folder) / 1024) + "KB");
                    fileSize = (calculateFolderLength(ossClient, bucketName, folder) / 1024);
                }
                List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
                for (OSSObjectSummary s : sums) {
//                    System.out.println(s.getKey() + " 111111111111111: " + (s.getSize() / 1024) + "KB");
                }
            } while (objectListing.isTruncated());
        } catch (OSSException oe) {
//            System.out.println("Caught an OSSException, which means your request made it to OSS, "
//                    + "but was rejected with an error response for some reason.");
//            System.out.println("Error Message:" + oe.getErrorMessage());
//            System.out.println("Error Code:" + oe.getErrorCode());
//            System.out.println("Request ID:" + oe.getRequestId());
//            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
//            System.out.println("Caught an ClientException, which means the client encountered "
//                    + "a serious internal problem while trying to communicate with OSS, "
//                    + "such as not being able to access the network.");
//            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
//            if (osscon != null) {
                ossClient.shutdown();
//                osscon.shutdown();
            }
        }
        return fileSize;
    }
    /**
     * 计算文件大小
     * 获取某个存储空间下指定目录(文件夹)下的文件大小。
     * @param ossClient
     * @param bucketName
     * @param folder
     * @return
     */
    private static long calculateFolderLength(OSS ossClient, String bucketName, String folder) {
        long size = 0L;
        ObjectListing objectListing = null;
        do {
            // MaxKey默认值为100,最大值为1000。
            ListObjectsRequest request = new ListObjectsRequest(bucketName).withPrefix(folder).withMaxKeys(1000);
            if (objectListing != null) {
                request.setMarker(objectListing.getNextMarker());
            }
            objectListing = ossClient.listObjects(request);
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            for (OSSObjectSummary s : sums) {
                size += s.getSize();
            }
        } while (objectListing.isTruncated());
        return size;
    }

4. 工具类整合

注意: 默认列举数量为100个,如果文件夹中超过100,则只会列举前100个,想要列举更多,可以通过设置maxKeys参数的值,最大为1000
//设置最大列举数量 listObjectsRequest.setMaxKeys(1000);
OssFileUtils.java

package com.oss.Utils;

import com.aliyun.oss.*;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassDescription: 文件及文件夹的操作
 * 官网地址:
 * https://help.aliyun.com/zh/oss/developer-reference/list-objects-3?spm=a2c4g.11186623.0.0.4789a744TF3rDO
 * 官网对文件夹的说明:
 * - OSS没有文件夹的概念,所有元素都是以文件来存储。创建文件夹本质上来说是创建了一个大小为0并以正斜线(/)结尾的文件。这个文件可以被上传和下载,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。关于创建文件夹的完整示例代码,请参见GitHub示例。
 * - 通过delimiter和prefix两个参数可以模拟文件夹功能:
 *      如果设置prefix为某个文件夹名称,则会列举以此prefix开头的文件,即该文件夹下所有的文件和子文件夹(目录)均显示为objects。
 *      如果在设置了prefix的情况下,将delimiter设置为正斜线(/),则只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件夹(目录)显示为CommonPrefixes,子文件夹下的文件和文件夹不显示。
 * - 注意: 默认列举数量为100个,如果文件夹中超过100,则只会列举前100个,想要列举更多,可以通过设置maxKeys参数的值,最大为1000
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2023/12/18 8:46
 */
@Component
public class OssFileUtils {
    private static final String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
    private static final String accessKeyId = "LdiEKDe9eE8EDDJREe899Ee4Qdjfe93LEsDE3390Ded";
    private static final String accessKeySecret = "Elkedfe393rkDFdfe4F4Ctvwt4IeE4l4d4kjlJL4Ld";

    /**
     * 列举指定桶的所有文件夹
     * @param bucketName 桶名称
     * @return 返回文件夹列表
     */
    public static List listBucketPackages(String bucketName){

        List packageList = new ArrayList();
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出桶目录下的所有文件和文件夹。此处为空即可
        listObjectsRequest.setPrefix("");
        //设置最大列举数量
        listObjectsRequest.setMaxKeys(1000);
        // 列举文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有commonPrefix。
        System.out.println("CommonPrefixes:");
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
            packageList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return packageList;
    }


    /**
     * 列举指定桶的所有文件和文件夹
     * @param bucketName 桶名称
     * @return 返回文件和文件夹列表
     */
    public static List listBucketFileAndPackage(String bucketName){
        List packageList = new ArrayList();
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出桶目录下的所有文件和文件夹。此处为空即可
        listObjectsRequest.setPrefix("");
        //设置最大列举数量
        listObjectsRequest.setMaxKeys(1000);
        // 列举文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            packageList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("CommonPrefixes:");
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
            packageList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return packageList;
    }



    /**
     * 列举存储空间下的所有文件
     * @param bucketName 存储空间的桶名称
     * @return
     */
    public static List listAllFilesForBucket(String bucketName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 列举文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        List objList = new ArrayList();
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            objList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("CommonPrefixes:");
//        List comprefList = new ArrayList();
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
//            comprefList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        fileList.add(objList);
//        fileList.add(comprefList);
        return fileList;
    }



    /**
     * 列举指定目录下的所有文件(包含了子目录下的所有文件及子目录)
     * @param bucketName 桶名称
     * @param prefixName 指定目录的名称 如 fun/
     * @return 返回指定目录下的所有文件
     */
    public static List listAllFileByPrefix(String bucketName, String prefixName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置prefix参数来获取fun目录下的所有文件。
//            listObjectsRequest.setPrefix("fun/");
        listObjectsRequest.setPrefix(prefixName);
        // 递归列举fun目录下的所有文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            fileList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("\nCommonPrefixes:");
        for (String commonPrefix : listing.getCommonPrefixes()) {
//            System.out.println(commonPrefix);
//            fileList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return fileList;
    }





    /**
     * 列举文件夹下的文件夹及文件
     * 列举目录下的文件和子目录(只有一层,子目录下的子文件和子子目录不管)
     * @param bucketName 桶名称
     * @param prefixName 文件夹名称
     * @return 返回文件夹下所有文件和目录列表
     */
    public static List listAllFilesAndPackagesByPrefix(String bucketName, String prefixName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出fun目录下的所有文件和文件夹。
//            listObjectsRequest.setPrefix("fun/");
        listObjectsRequest.setPrefix(prefixName);
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。
        System.out.println("Objects:");
        // objectSummaries的列表中给出的是fun目录下的文件。
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
            fileList.add(objectSummary.getKey());
        }
        // 遍历所有commonPrefix。
        System.out.println("\nCommonPrefixes:");
        // commonPrefixs列表中显示的是fun目录下的所有子文件夹。由于fun/movie/001.avi和fun/movie/007.avi属于fun文件夹下的movie目录,因此这两个文件未在列表中。
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
            fileList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return fileList;
    }

    /**
     * 只列举文件夹下的所有文件夹
     * 列举目录下所有子目录(只有一层,子目录下的子文件和子子目录不管)
     * @param bucketName 桶名称
     * @param prefixName 文件夹名称
     * @return 返回文件夹下所有文件和目录列表
     */
    public static List listAllPackagesByPrefix(String bucketName, String prefixName){
        List fileList = new ArrayList();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出fun目录下的所有文件和文件夹。
//            listObjectsRequest.setPrefix("fun/");
        listObjectsRequest.setPrefix(prefixName);
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有commonPrefix。
//        System.out.println("\nCommonPrefixes:");
        // commonPrefixs列表中显示的是fun目录下的所有子文件夹。由于fun/movie/001.avi和fun/movie/007.avi属于fun文件夹下的movie目录,因此这两个文件未在列表中。
        for (String commonPrefix : listing.getCommonPrefixes()) {
//            System.out.println(commonPrefix);
            fileList.add(commonPrefix);
        }
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return fileList;
    }


    /**
     * 计算文件夹下所有文件大小
     * 通过GetBucket (ListObjects)方法获取指定目录下的文件大小
     * @param bucketName 桶名称
     * @param keyPrefix 所要计算的文件夹,后缀不加斜杠
     * @return 返回文件夹下文件大小
     */
    public static long fileSizeUtil(String bucketName, String keyPrefix){
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        long fileSize = 0;
        try {
            ObjectListing objectListing = null;
            do {
                // 默认情况下,每次列举100个文件或目录。
                ListObjectsRequest request = new ListObjectsRequest(bucketName).withDelimiter("/").withPrefix(keyPrefix);
                if (objectListing != null) {
                    request.setMarker(objectListing.getNextMarker());
                }
                objectListing = ossClient.listObjects(request);
//                objectListing = osscon.listObjects(request);
                List<String> folders = objectListing.getCommonPrefixes();
                for (String folder : folders) {
//                    System.out.println(folder + " fffffffffffffff: " + (calculateFolderLength(ossClient, bucketName, folder) / 1024) + "KB");
//                    System.out.println(folder + " : " + (calculateFolderLength(osscon, bucketName, folder) / 1024) + "KB");
                    fileSize = (calculateFolderLength(ossClient, bucketName, folder) / 1024);
                }
                List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
                for (OSSObjectSummary s : sums) {
//                    System.out.println(s.getKey() + " 111111111111111: " + (s.getSize() / 1024) + "KB");
                }
            } while (objectListing.isTruncated());
        } catch (OSSException oe) {
//            System.out.println("Caught an OSSException, which means your request made it to OSS, "
//                    + "but was rejected with an error response for some reason.");
//            System.out.println("Error Message:" + oe.getErrorMessage());
//            System.out.println("Error Code:" + oe.getErrorCode());
//            System.out.println("Request ID:" + oe.getRequestId());
//            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
//            System.out.println("Caught an ClientException, which means the client encountered "
//                    + "a serious internal problem while trying to communicate with OSS, "
//                    + "such as not being able to access the network.");
//            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
//            if (osscon != null) {
                ossClient.shutdown();
//                osscon.shutdown();
            }
        }
        return fileSize;
    }
    /**
     * 计算文件大小
     * 获取某个存储空间下指定目录(文件夹)下的文件大小。
     * @param ossClient
     * @param bucketName
     * @param folder
     * @return
     */
    private static long calculateFolderLength(OSS ossClient, String bucketName, String folder) {
        long size = 0L;
        ObjectListing objectListing = null;
        do {
            // MaxKey默认值为100,最大值为1000。
            ListObjectsRequest request = new ListObjectsRequest(bucketName).withPrefix(folder).withMaxKeys(1000);
            if (objectListing != null) {
                request.setMarker(objectListing.getNextMarker());
            }
            objectListing = ossClient.listObjects(request);
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            for (OSSObjectSummary s : sums) {
                size += s.getSize();
            }
        } while (objectListing.isTruncated());
        return size;
    }

    /**
     * 计算文件大小
     * 获取某个存储空间下指定目录(文件夹)下的文件大小。
     * @param bucketName
     * @param folder
     * @return
     */
    private static long calculateFolderSize(String bucketName, String folder) {
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        long size = 0L;
        ObjectListing objectListing = null;
        do {
            // MaxKey默认值为100,最大值为1000。
            ListObjectsRequest request = new ListObjectsRequest(bucketName).withPrefix(folder).withMaxKeys(1000);
            if (objectListing != null) {
                request.setMarker(objectListing.getNextMarker());
            }
            objectListing = ossClient.listObjects(request);
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            for (OSSObjectSummary s : sums) {
                size += s.getSize();
            }
        } while (objectListing.isTruncated());
        return size;
    }


}

拓展业务逻辑计算

计算指定桶内所有设备的指定文件夹中的文件,统计总和并输出,编写工具
YearSizeCalUtilForOssFile.java

package com.oss.Utils;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @ClassDescription:
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2023/12/18 14:15
 */
@Component
public class YearSizeCalUtilForOssFile {
    private static final String bucketName = "hs-li-bai";

    /**
     * 计算所有设备对应DATA数据的22年和23年的文件总和,即所有设备22年的文件大小,和23年的大小
     * @return
     */
    public static JSONObject fileSizeForYear(){
        List list = OssFileUtils.listBucketPackages(bucketName);
        List deviceIdList = new ArrayList();
        for (int i = 0; i < list.size(); i++) {
            String filePackage = list.get(i).toString();
            if (filePackage.contains("Num")){
//            if (filePackage.contains("UA")){
                filePackage = filePackage.replace("/","");
                deviceIdList.add(filePackage);
            }
        }
        //排序
        deviceIdList = Arrays.asList(deviceIdList.stream().sorted().toArray());
        System.out.println(deviceIdList);
        
        long fileSizeFor22 = 0;
        long fileSizeFor23 = 0;
        long allDeviceAllSize=0;
        List sizeList22 = new ArrayList();
        List sizeList23 = new ArrayList();
        JSONObject  fileSizeInfo = new JSONObject();
        for (int i = 0; i < deviceIdList.size(); i++) {
            JSONObject oneDeviceSize = new JSONObject();
            String deviceId = deviceIdList.get(i).toString();
            String prefixName = deviceId+"/DATA/";
            List yearList = OssFileUtils.listAllPackagesByPrefix(bucketName, prefixName);
//            System.out.println(yearList);
            long filesize22 = 0;
            if (yearList.contains(prefixName+"22/")){
                filesize22 = OssFileUtils.fileSizeUtil(bucketName, prefixName + "22");
                sizeList22.add(filesize22);
                oneDeviceSize.put("22",filesize22);
            }else{
                oneDeviceSize.put("22",0);
            }
            fileSizeFor22= fileSizeFor22+filesize22;
            long filesize23 = 0;
            if (yearList.contains(prefixName+"23/")){
                filesize23 = OssFileUtils.fileSizeUtil(bucketName, prefixName + "23");
                sizeList23.add(filesize23);
                oneDeviceSize.put("23",filesize23);
            }else{
                oneDeviceSize.put("23",0);
            }
            fileSizeFor23= fileSizeFor23+filesize23;
            long oneDeviceAllSize = OssFileUtils.fileSizeUtil(bucketName, prefixName);
            allDeviceAllSize = allDeviceAllSize+oneDeviceAllSize;
            fileSizeInfo.put(deviceId, oneDeviceSize);
        }
        System.out.println("================================================>>>>");
        System.out.println(fileSizeInfo);
        System.out.println("全部文件大小: "+allDeviceAllSize + "KB");
        System.out.println("22年文件大小: "+ fileSizeFor22 + "KB");
        System.out.println("23年文件大小: "+ fileSizeFor23 + "KB");

        return fileSizeInfo;


    }


}

5. 测试

测试的main方法代码
RequestController.java

package com.oss.controller;

import com.oss.Utils.YearSizeCalUtilForOssFile;
import java.util.concurrent.TimeUnit;

/**
 * @ClassDescription:
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2023/12/15 9:54
 */
public class RequestController {
    public static void main(String[] args) {
        long calTimeStarting = System.currentTimeMillis();
        
        YearSizeCalUtilForOssFile.fileSizeForYear();

        long calTimeEnding = System.currentTimeMillis();

        long calTime = calTimeEnding - calTimeStarting;

        long minutes = TimeUnit.MILLISECONDS.toMinutes(calTime);

        System.out.println("消耗时间(分):"+minutes);

    }


}

执行后输出打印如下
在这里插入图片描述


感谢阅读,祝君暴富!

文章来源:https://blog.csdn.net/mo_sss/article/details/135078949
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。