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

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


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


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

文章目录

  • 一、介绍
  • 二、依赖
  • 三、实现
    • 1. 连接参数
    • 2. 列举文件
      • 2.1 列举bucket的所有文件夹(单层)
      • 2.2 列举指定bucket中的所有文件夹和文件(单层)
      • 2.3 列举指定bucket中的所有文件(多层)
      • 2.4 列举指定文件夹的所有文件(多层)
      • 2.5 列举指定文件夹中的所有文件夹和文件(单层)
      • 2.6 列举指定bucket中的所有文件夹(单层)
    • 3. 文件大小计算
    • 4. 工具类整合
      • 拓展业务逻辑计算
    • 5. 测试


一、介绍

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);}}

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


感谢阅读,祝君暴富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/297573.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来&#xff0c;2023的步伐也将远去。而博主的系列文章&#xff0c;也将从今天起&#xff0c;越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面&#xff0c;无论使用什么框架、组件或工具&#xff0c;皆可拿来用之。 那么…

DaVinci各版本安装指南

链接: https://pan.baidu.com/s/1g1kaXZxcw-etsJENiW2IUQ?pwd0531 ​ #2024版 1.鼠标右击【DaVinci_Resolve_Studio_18.5(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 DaVinci_Resolve_Studio_18.5(64bit)】。 2.打开解压后的文…

什么是网站监控?

网站监控是跟踪网站的可用性和性能&#xff0c;以最小化宕机时间&#xff0c;优化性能并确保顺畅的用户体验。维护网站正常运行对于任何企业来说都是至关重要的&#xff0c;因而对大多数业务来说&#xff0c;网站应用监控都是一个严峻的挑战。Applications Manager网站应用监控…

基于SSM的剧本杀预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的剧本杀预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

<JavaEE> 协议格式 -- 传输层协议 UDP

目录 一、UDP协议格式长啥样&#xff1f; 二、端口号和IP地址 1&#xff09;UDP协议中包含哪两个端口号&#xff1f; 2&#xff09;有没有包含IP地址&#xff1f; 三、UDP报文长度 1&#xff09;UDP报文长度最长多长&#xff1f; 2&#xff09;UDP报文的组成&#xff1f…

项目管理4321方法论

文章目录 一、项目立项准备&#xff08;4步&#xff09;case1、识别价值---解决背后痛点的才是价值&#xff0c;价值是做任何事情的出发点case2、明确目标---支撑价值实现的&#xff0c;目标是 具体/可衡量/可达到/相关性/有时限的case3、识别干系人---找对人才能做对事&#x…

数学的雨伞下:理解世界的乐趣

这本书没有一个公式&#xff0c;却讲透了数学的本质&#xff01; 《数学的雨伞下&#xff1a;理解世界的乐趣》。一本足以刷新观念的好书&#xff0c;从超市到对数再到相对论&#xff0c;娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者&#xff1a;米卡埃尔•洛奈…

数学建模之聚类模型详解

聚类模型 引言 “物以类聚&#xff0c;人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测&#xff1b;也可以探究不同类之间的相关性和主…

实在没货,简历(软件测试)咋写?

简历咋写&#xff0c;这是很多没有【软件测试实际工作经验】的同学们非常头疼的事情。 简历咋写&#xff1f;首先你要知道简历的作用。 简历的作用是啥呢&#xff1f; 一句话就是&#xff1a;让HR小姐姐约你。 如何让HR看你一眼&#xff0c;便相中你的简历&#xff0c;实现在众…

原来电脑并不需要重装系统才能恢复出厂设置,这个操作学起来!

前言 小伙伴们应该都知道手机上有恢复出厂设置的功能&#xff0c;如果想要把手机送给朋友或者卖给别人&#xff0c;就会先恢复出厂设置。 但换到Windows电脑上之后&#xff0c;如果出现同样的情况&#xff0c;就会第一时间想到重装系统。就好像Windows电脑上不存在恢复出厂设…

音视频的编码格式与封装格式

音视频的编码格式与封装格式是两个不同的概念&#xff0c;视频封装格式常见的有&#xff1a;mp4&#xff0c;rmvb&#xff0c;avi&#xff0c;mkv&#xff0c;mov&#xff0c;mpg&#xff0c;vob&#xff0c;3gp&#xff0c;asf&#xff0c;rmvb&#xff0c;wmv&#xff0c;div…

Qt Creator可视化交互界面exe快速入门1

Qt的安装链接&#xff1a;Index of /archive/qt 5.14版本之前都是可以直接离线安装&#xff0c;即下载完整安装包之后在本地安装。 最新及5,15版本之后的都不支持直接的离线安装了&#xff0c;需要通过下载器来进行安装。下载地址&#xff1a;Index of /official_releases/onl…