java获取对象存储oss的bucket容量使用情况

一、前言

1.阿里云的对象存储oss的java api中没有直接获取bucket容量使用情况的接口,度娘N久之后整理出一种间接统计方法:即递归获取根目录下所有文件大小,相加后得出已用容量。
2.网上还有一种方法:通过OSS监控服务获取使用情况,有兴趣的朋友可以试试,
地址链接:https://developer.aliyun.com/ask/2278

二、正文

1.引入maven依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.8.2</version>
</dependency>

2.示例代码

package com.hzjp.dev.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.*;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.arms.model.v20190808.QueryMetricRequest;
import com.aliyuncs.arms.model.v20190808.QueryMetricResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import java.io.InputStream;
import java.util.*;

/**
 * Created by Administrator on 2018/5/9.
 */
@Slf4j
public class OssUtils {


    private static String ENDPOINT = "your oss point";
    private static String ACCESSKEYID = "your accesskeyid";
    private static String ACCESSKEYSECRET = "your accesskeysecret";
    private static String NEW_BUCKET = "your bucket name";

    private static OSSClient client = null;


    /** 创建OSSClient实例
     *
     * @return
     */
    private static OSSClient getOssClient(){
        client = new OSSClient(ENDPOINT, ACCESSKEYID, ACCESSKEYSECRET);
        return client;
    }

    /** 关闭OSSClient
     *
     */
    private static void close(){
        OssUtils.getOssClient().shutdown();
    }


    /**
     * 获取根目录下所有文件大小
     * @param bucketName
     * @return
     */
    public static Long getOss(String bucketName){
        try {
            if (StringUtils.isBlank(bucketName)) {
                bucketName = NEW_BUCKET;
            }
            long sizeTotal = 0L;
            ObjectListing objectListing = null;
            do {
                // 列举bucket所有文件或目录,每次1000个
                ListObjectsRequest request = new ListObjectsRequest(bucketName).withDelimiter("/").withMaxKeys(1000);
                // 列举bucket的指定目录(yourPrefix)下文件,每次1000个
                // ListObjectsRequest request = new ListObjectsRequest(bucketName).withMaxKeys(1000).withPrefix("yourPrefix");

                if (objectListing != null) {
                    request.setMarker(objectListing.getNextMarker());
                }
                objectListing = OssUtils.getOssClient().listObjects(request);
                //获取当前文件夹下所有子目录大小
                List<String> folders = objectListing.getCommonPrefixes();
                for (String folder : folders) {
                    sizeTotal = calculateFolderLength(OssUtils.getOssClient(), bucketName, folder)+sizeTotal;
                }

                //获取当前文件夹下所有文件大小
                List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
                if (sums.size()==0){
                    continue;
                }
                for (OSSObjectSummary s : sums) {
                    sizeTotal = sizeTotal+s.getSize();
                }

            } while (objectListing.isTruncated());
            //转换为TB
            sizeTotal = sizeTotal/1024/1024/1024/1024;
            log.info(" 文件夹下所有子目录大小 : [{}] TB",sizeTotal);
            return sizeTotal;
        }catch (Exception e){
            e.printStackTrace();
            return 0L;
        }finally {
            OssUtils.close();
        }

    }

    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;
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
阿⾥云 对象存储 SDK ⽰例 ⽂档版本:20190920 对象存储 SDK ⽰例 ⽂档版本:20190920 I 法律声明....................................................................................I 通⽤约定....................................................................................I 1 SDK ⽂档简介.........................................................................1 2 Java......................................................................................2 2.1 前⾔............................................................................................................2 2.2 安装............................................................................................................3 2.3 快速⼊⻔......................................................................................................4 2.4 初始化.........................................................................................................8 2.5 存储空间....................................................................................................12 2.6 请求者付费模式...........................................................................................17 2.7 单链接限速.................................................................................................19 2.8 存储空间标签..............................................................................................21 2.9 对象标签....................................................................................................23 2.9.1 设置对象标签...................................................................................23 2.9.2 获取对象标签...................................................................................32 2.9.3 删除对象标签...................................................................................32 2.9.4 对象标签和⽣命周期管理....................................................................33 2.10 服务器端加密............................................................................................ 35 2.11 上传⽂件..................................................................................
您好!关于您的问题,我可以为您提供如下回答: 要通过邮箱发送 Java OSS 存储的图片,您可以先将图片从 OSS 中下载到本地,然后再将图片作为附件添加到您的邮件中发送。以下是示例代码: ```java import java.io.File; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeUtility; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.OSSObject; public class SendMailWithImage { public static void main(String[] args) throws Exception { // 配置OSS信息 String endpoint = "<yourEndpoint>"; String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; String objectKey = "<yourObjectKey>"; String ossFileName = "<yourOSSFileName>"; // 下载OSS中的图片到本地 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); OSSObject ossObject = ossClient.getObject(bucketName, objectKey); ossClient.getObject(new GetObjectRequest(bucketName, objectKey), new File(ossFileName)); ossClient.shutdown(); // 发送邮件 Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.host", "<yourSmtpServer>"); Session session = Session.getInstance(props); Message message = new MimeMessage(session); message.setFrom(new InternetAddress("<yourEmail>")); message.setRecipient(Message.RecipientType.TO, new InternetAddress("<recipientEmail>")); message.setSubject("图片邮件"); message.setText("这是一封带有图片的邮件。"); MimeMultipart multipart = new MimeMultipart("related"); MimeBodyPart imagePart = new MimeBodyPart(); FileDataSource fds = new FileDataSource(ossFileName); imagePart.setDataHandler(new DataHandler(fds)); imagePart.setContentID("myImage"); imagePart.setFileName(MimeUtility.encodeText(fds.getName())); multipart.addBodyPart(imagePart); MimeBodyPart contentPart = new MimeBodyPart(); contentPart.setContent("<html><body><h1>这是一封带有图片的邮件。</h1><img src=\"cid:myImage\"></body></html>", "text/html;charset=utf-8"); multipart.addBodyPart(contentPart); message.setContent(multipart); Transport transport = session.getTransport(); transport.connect("<yourEmail>", "<yourPassword>"); transport.sendMessage(message, message.getAllRecipients()); transport.close(); System.out.println("邮件发送成功!"); } } ``` 需要注意的是,以上代码并未完整展示如何配置邮件发送方信息和接收方信息,以及如何配置OSS的信息。您需要根据实际情况进行相应的修改。另外,您需要将以上代码中的 `"<yourEndpoint>"`、`"<yourAccessKeyId>"`、`"<yourAccessKeySecret>"`、`"<yourBucketName>"`、`"<yourObjectKey>"` 和 `"<yourOSSFileName>"` 替换为您实际使用OSS信息。 希望这个回答能够帮助到您,如果您还有其他问题,欢迎随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值