天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
文章目录
- 一、介绍
- 二、依赖
- 三、实现
- 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);}}
执行后输出打印如下
感谢阅读,祝君暴富!