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("异常");
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值