oss文件操作(文件列举、文件大小)
天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
文章目录
一、介绍
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);
}
}
执行后输出打印如下
感谢阅读,祝君暴富!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!