OSS阿里资源存储 工具类

最开始先写了工具类OSSUtil
第一版是在静态代码块中初始化 OSS ossclient
但是因为是工具类 所以好多东西是在application.yml里配置的
通过@value注入不进来(因为static是在类声明的时候执行的, 所以配置信息还没有注入)

后来改成了OSSConfiguration 配置的形式 下面直接上代码
OSSUtil

package com.hzt.intellect.utils;

import com.aliyun.oss.*;
import com.aliyun.oss.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;

/**
 * 阿里oss工具类
 * author yjj 2022-03-04
 *
 */
@Slf4j
public class OSSUtil {

    private static OSS ossclient=null;

    private static OSSConfig ossConfig;

    public OSSUtil(OSSConfig ossConfig){
        Assert.hasText(ossConfig.getAccessKeyId(), "accessKey不能为空");
        Assert.hasText(ossConfig.getAccessKeySecret(), "secret不能为空");
        Assert.hasText(ossConfig.getBucketName(), "bucketName不能为空");
        Assert.hasText(ossConfig.getEndpoint(), "endpoint不能为空");
        Assert.notNull(ossConfig.getCount(), "count不能为空");
        Assert.notNull(ossConfig.getOutTime(), "outTime不能为空");
        this.ossConfig = ossConfig;
        init();
    }

    /**
     * 获取阿里云OSS客户端对象
     *
     * return ossClient
     */
    private void init() {
        //设置超时机制和重试机制
        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(ossConfig.getOutTime());
        conf.setMaxErrorRetry(ossConfig.getCount());
        ossclient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
    }


    /**
     * 创建模拟文件夹
     *
     * param ossClient oss连接
     * param bucketName 存储空间
     * param folder 模拟文件夹名如"qj_nanjing/"
     * return 文件夹名
     */
    public String createFolder(String folder) {
        // 文件夹名
        final String keySuffixWithSlash = folder;
        // 判断文件夹是否存在,不存在则创建
        if (!ossclient.doesObjectExist(ossConfig.getBucketName(), keySuffixWithSlash)) {
            // 创建文件夹
            ossclient.putObject(ossConfig.getBucketName(), keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
            log.info("创建文件夹成功");
            // 得到文件夹名
            OSSObject object = ossclient.getObject(ossConfig.getBucketName(), keySuffixWithSlash);
            String fileDir = object.getKey();
            return fileDir;
        }
        return keySuffixWithSlash;
    }


    /**
     * 根据key删除OSS服务器上的文件
     *
     * param ossClient oss连接
     * param bucketName 存储空间
     * param folder 模拟文件夹名 如"wenjian/"
     * param key 文件名 如:"test.jpg"
     */
    public void deleteFile(String folder, String key) {
        ossclient.deleteObject(ossConfig.getBucketName(), folder + key);
        log.info("删除" + ossConfig.getBucketName() + "下的文件" + folder + key + "成功");
    }

    /**
     * 上传文件。
     *
     * @param file 需要上传的文件路径
     * @return 如果上传的文件是图片的话,会返回图片的"URL",如果非图片的话会返回"非图片,不可预览。文件路径为:+文件路径"
     */
    public String upLoad(File file, String fileHost) {
        String reFileUrl = "";
        // 默认值为:true
        boolean isImage = true;
        // 判断所要上传的图片是否是图片,图片可以预览,其他文件不提供通过URL预览
        try {
            Image image = ImageIO.read(file);
            isImage = image == null ? false : true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        log.info("------OSS文件上传开始--------" + file.getName());
        // 判断文件
        if (file == null) {
            return null;
        }
        try {
            // 判断容器是否存在,不存在就创建
            if (!ossclient.doesBucketExist(ossConfig.getBucketName())) {
                ossclient.createBucket(ossConfig.getBucketName());
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(ossConfig.getBucketName());
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossclient.createBucket(createBucketRequest);
            }
            // 设置文件路径和名称
            String fileUrl = fileHost + "/" + file.getName();

            if (isImage) {//如果是图片,则图片的URL为:....
                reFileUrl = "https://" + ossConfig.getBucketName() + "." + ossConfig.getEndpoint() + "/" + fileUrl;
            } else {
                reFileUrl = fileUrl;
                log.info("非图片,不可预览。文件路径为:" + fileUrl);
            }

            // 上传文件
            PutObjectResult result = ossclient.putObject(new PutObjectRequest(ossConfig.getBucketName(), fileUrl, file));
            // 设置权限(公开读)
            ossclient.setBucketAcl(ossConfig.getBucketName(), CannedAccessControlList.PublicRead);
            if (result != null) {
                log.info("------OSS文件上传成功------" + fileUrl);
            }
        } catch (OSSException oe) {
            log.error(oe.getMessage());
        } catch (ClientException ce) {
            log.error(ce.getErrorMessage());
        } finally {
            if (ossclient != null) {
                ossclient.shutdown();
            }
        }
        return reFileUrl;
    }

    /**
     * 通过文件名下载文件
     *
     * @param objectName    要下载的文件名
     * @param localFileName 本地要创建的文件名(不要后缀)
     */
    public void downloadFile(String objectName, String localFileName) {
        try {
            String suffix = objectName.substring(objectName.lastIndexOf("."));
            if (suffix != null && !"".equals(suffix)){
                localFileName = localFileName.concat(suffix);
            }
        }catch (Exception e){
            log.error("文件未检测到后缀名称:{}", objectName);
        }

        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
        ossclient.getObject(new GetObjectRequest(ossConfig.getBucketName(), objectName), new File(localFileName));
        // 关闭OSSClient。
        ossclient.shutdown();
    }

}

OSSConfig

package com.hzt.intellect.utils;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
public class OSSConfig {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private Integer count;
    private Integer outTime;

}

OSSConfiguration

package com.hzt.intellect.config;

import com.hzt.intellect.utils.OSSConfig;
import com.hzt.intellect.utils.OSSUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OSSConfiguration {

    @Value("${oss.endpoint}")
    private String endpoint;
    @Value("${oss.accessKeyId}")
    private String accessKeyId;
    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${oss.bucketName}")
    private String bucketName;
    @Value("${oss.count}")
    private Integer count;
    @Value("${oss.outTime}")
    private Integer outTime;

    @Bean
    public OSSUtil OSSUtil() {
        OSSConfig ossConfig = new OSSConfig();
        ossConfig.setAccessKeyId(accessKeyId);
        ossConfig.setAccessKeySecret(accessKeySecret);
        ossConfig.setBucketName(bucketName);
        ossConfig.setCount(count);
        ossConfig.setEndpoint(endpoint);
        ossConfig.setOutTime(outTime);
        return new OSSUtil(ossConfig);
    }
}

配置
application.yml配置
使用

@Autowired
OSSUtil ossUtil;

@RequestMapping("/test")
    public Result test() {
        try {
            File file =new File("D:\\test\\test.docx");
            return Result.ok(ossUtil.upLoad(file, "test"));
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("异常");
        }
    }
OSS阿里云对象存储服务)是阿里云提供的一种云存储服务,用于在云端存储和管理各种类型的数据。在使用OSS服务时,我们可能会遇到需要管理对象的生命周期,即设置对象的存储周期,比如指定对象何时转为冷存储或删除的需求。为了方便开发者管理OSS对象的生命周期,阿里云提供了一种Java工具类,即OSS声明周期工具类OSS声明周期工具类提供了一套简便的方式来设置OSS对象的生命周期规则。通过该工具类,我们可以配置对象的存储周期,包括两个主要方面:转为低频访问存储和删除对象。其中,转为低频访问存储是指将对象从标准存储转移到低频访问存储,以降低成本,适用于长期不被频繁访问的对象;删除对象是指在一定时间后自动删除对象,以减少存储空间的占用。通过设置不同的规则和条件,可以实现对不同对象的不同管理策略。 使用OSS声明周期工具类,我们可以通过代码的方式配置和管理OSS对象的存储周期,避免了手动操作的繁琐和错误。通过调用工具类提供的API,我们可以设置存储周期的开始时间、转为低频访问存储的时间、删除的时间等各种参数,灵活满足不同的业务需求。此外,工具类还提供了其他常用的方法,例如获取已配置的生命周期规则、启用或停用生命周期规则等等,方便开发者进行管理和操作。 总之,OSS声明周期工具类为我们在阿里云OSS上管理对象的生命周期提供了便捷的方式。通过使用该工具类,我们可以简化配置和管理的流程,提升效率,并且更好地满足不同对象的不同管理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值