OSS文件管理

和传统的单体应用不同,这里我们选择将数据上传到分布式文件服务器上。

这里我们选择将图片放置到阿里云上,使用对象存储。

阿里云上使使用对象存储方式:

在这里插入图片描述

创建Bucket
在这里插入图片描述

endpoint的取值:
在这里插入图片描述
accessKeyId和accessKeySecret需要创建一个RAM账号:
在这里插入图片描述

创建用户完毕后,会得到一个“AccessKey ID”和“AccessKeySecret”,然后复制这两个值到代码的“AccessKey ID”和“AccessKeySecret”。

另外还需要添加访问控制权限

在这里插入图片描述

配置yml文件  ,
# 阿里云 OSS
# 外网访问的Endpoint(地域节点)(下方实例是北京,改成你自己的)
# 不同的服务器,地址不同  !!!注意不要加空格!!!
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=填你的AccessKey ID
aliyun.oss.file.keysecret=填你的AccessKey Secret
# bucket可以在控制台创建 也可以使用java代码创建
aliyun.oss.file.bucketname=你的Bucket名称


package com.fullstar.sjps.xcjc.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 阿里云服务
 *
 * @author cf
 * @date 2022-06-15 11:41
 */
@Component
public class OSSUtils {
    private static String ENDPOINT;
    private static String ACCESS_KEY_ID;
    private static String ACCESS_KEY_SECRET;
    private static String BUCKET_NAME;
    private static String SUFFER_URL;
    private static String PARENT_DIR;

    @Value("${OSS.endpoint}")
    public void setENDPOINT(String endpoint) {
        OSSUtils.ENDPOINT = endpoint;
    }

    @Value("${OSS.accessKeyId}")
    public void setAccessKeyId(String accessKeyId) {
        OSSUtils.ACCESS_KEY_ID = accessKeyId;
    }

    @Value("${OSS.accessKeySecret}")
    public void setAccessKeySecret(String accessKeySecret) {
        OSSUtils.ACCESS_KEY_SECRET = accessKeySecret;
    }

    @Value("${OSS.bucketName}")
    public void setBucketName(String bucketName) {
        OSSUtils.BUCKET_NAME = bucketName;
    }

    @Value("${OSS.suffurl}")
    public void setSufferUrl(String suffurl) {
        OSSUtils.SUFFER_URL = suffurl;
    }

    @Value("${OSS.parentDir}")
    public void setParentDir(String parentDir) {
        OSSUtils.PARENT_DIR = parentDir;
    }


    /**
     * 上传单张图片
     *
     * @param file
     * @param dirPath 父文件夹名称
     * @return 上传成功返回存储路径,失败返回null
     */
    public static String uploadFile(MultipartFile file, String dirPath) {
        // 获取源文件名称
        String fileName = file.getOriginalFilename();
        // 获取源文件后缀名
        String etx = fileName.substring(fileName.lastIndexOf("."));
        // 生成存储路径
        String filePath = PARENT_DIR + "/" + dirPath + "/" + UUID.randomUUID().toString().replaceAll("-", "") + etx;

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

        try {
            // 上传图片
            PutObjectResult result = ossClient.putObject(BUCKET_NAME, filePath, new ByteArrayInputStream(CompressUtils.compressPicForScale(file.getBytes(), 64)));
            // 设置私有权限读写
            // ossClient.setBucketAcl(BUCKET_NAME, CannedAccessControlList.Default);
        } catch (Exception e) {
            e.printStackTrace();
            filePath = null;
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        return filePath;
    }
    public static String uploadAllFile(MultipartFile file, String dirPath) {
        // 获取源文件名称
        String fileName = file.getOriginalFilename();
        // 获取源文件后缀名
        String etx = fileName.substring(fileName.lastIndexOf("."));
        // 生成存储路径
        String filePath = PARENT_DIR + "/" + dirPath + "/" + UUID.randomUUID().toString().replaceAll("-", "") + etx;

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

        try {
            // 上传文件
            PutObjectResult result = ossClient.putObject(BUCKET_NAME, filePath, new BufferedInputStream(file.getInputStream()));
            // 设置私有权限读写
            // ossClient.setBucketAcl(BUCKET_NAME, CannedAccessControlList.Default);
        } catch (Exception e) {
            e.printStackTrace();
            filePath = null;
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        return filePath;
    }
    /**
     * 上传多张图片
     *
     * @param files
     * @param dirPath 父文件夹名称
     * @return 所有文件上传成功返回存储路径集合,任意一个文件上传失败返回null
     */
    public static List<String> uploadFiles(MultipartFile[] files, String dirPath) {
        List<String> filePaths = new ArrayList<>();
        for (int i = 0; i < files.length; i++) {
            String filePath = uploadFile(files[i], dirPath);
            if (filePath == null) {
                if (!filePaths.isEmpty()) {
                    deleteFiles(filePaths);
                }
                return null;
            }
            filePaths.add(filePath);
        }
        return filePaths;
    }

    /**
     * 批量删除文件
     *
     * @param filePaths
     */
    public static void deleteFiles(List<String> filePaths) {
        if (CollectionUtils.isEmpty(filePaths)) return;

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        try {
            filePaths.forEach((item) -> {
                if (StringUtils.isNotEmpty(item))
                    ossClient.deleteObject(BUCKET_NAME, item);
            });
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     * 删除单个文件
     *
     * @param filePath
     */
    public static void deleteFile(String filePath) {
        if (StringUtils.isEmpty(filePath)) return;

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        try {
            ossClient.deleteObject(BUCKET_NAME, filePath);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     * 获取图片完整权限路径
     *
     * @param filePath   图片存储路径
     * @param expiration 过期时间
     * @return
     */
    public static String getImgUrl(String filePath, Date expiration) {
        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        String imgPath = ossClient.generatePresignedUrl(BUCKET_NAME, filePath, expiration).toString();
        ossClient.shutdown();
        return imgPath;
    }

    /**
     * 获取过期时间,默认一个月有效
     *
     * @return
     */
    public static LocalDateTime getExpiration() {
        LocalDateTime now = LocalDateTime.now();
        return now.plusMonths(1);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值