springboot阿里云oss工具类

pom依赖;

yml配置:

读取配置文件类:

完整工具类代码:
`
import cn.hutool.core.lang.UUID;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import com.luzhizheng.common.config.OSSConfig;
import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**

  • @author Sappy
  • @date 4/6/2023 10:40:44
    */

@Component
public class AliYunOSSUtil {
private static Logger logger = LoggerFactory.getLogger(AliYunOSSUtil.class);
public static AliYunOSSUtil aliYunOSSUtil;

@PostConstruct
public void init() {
    aliYunOSSUtil = this;
    aliYunOSSUtil.ossConfig = this.ossConfig;
}

@Autowired
private OSSConfig ossConfig;

/**
 * 上传byte数组
 *
 * @param objectName 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
 * @param bytes      Byte数组。
 * @return
 */
public static String uploadByte(String objectName, byte[] bytes) {
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    String url = "";
    try {
        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(aliYunOSSUtil.ossConfig.getBucket()
                , objectName, new ByteArrayInputStream(bytes));
        // 设置该属性可以返回response。如果不设置,则返回的response为空。

// putObjectRequest.setProcess("true");
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
// 如果上传成功,则返回200。
// System.out.println(result.getResponse().getStatusCode());
url = "https://"
+ aliYunOSSUtil.ossConfig.getBucket()
+ "."
+ aliYunOSSUtil.ossConfig.getEndpoint()
+ "/"
+ objectName;
} catch (OSSException oe) {
logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
logger.error("Error Message:[{}]", oe.getErrorMessage());
logger.error("Error Code:[{}]", oe.getErrorCode());
logger.error("Request ID:[{}]", oe.getRequestId());
logger.error("Host ID:[{}]", oe.getHostId());
} catch (ClientException ce) {
logger.error("客户端在尝试与OSS通信时遇到问题");
logger.error("Error Message:[{}]", ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return url;

}


/**
 * 上传网络流
 *
 * @param objectName 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
 * @param url        网络流地址
 * @return
 */
public static String uploadUrl(String objectName, String url) {
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());

    String fileUrl = "";
    try {
        InputStream inputStream = new URL(url).openStream();
        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(aliYunOSSUtil.ossConfig.getBucket()
                , objectName, inputStream);
        // 设置该属性可以返回response。如果不设置,则返回的response为空。

// putObjectRequest.setProcess("true");
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
// 如果上传成功,则返回200。
// System.out.println(result.getResponse().getStatusCode());
fileUrl = "https://"
+ aliYunOSSUtil.ossConfig.getBucket()
+ "."
+ aliYunOSSUtil.ossConfig.getEndpoint()
+ "/"
+ objectName;
} catch (OSSException oe) {
logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
logger.error("Error Message:[{}]", oe.getErrorMessage());
logger.error("Error Code:[{}]", oe.getErrorCode());
logger.error("Request ID:[{}]", oe.getRequestId());
logger.error("Host ID:[{}]", oe.getHostId());
} catch (ClientException ce) {
logger.error("客户端在尝试与OSS通信时遇到问题");
logger.error("Error Message:[{}]", ce.getMessage());
} catch (MalformedURLException e) {
logger.error("url解析异常");
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return fileUrl;
}

/**
 * 上传本地文件
 *
 * @param folder 目录需以正斜线结尾 如:"exampledir/"。
 * @param file   file
 * @return
 */
@SneakyThrows
public static String upload(String folder, File file) {
    FileInputStream is = null;
    String url = "";
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    try {
        String absolutePath = file.getAbsolutePath();
        String fileName = file.getName();
        is = new FileInputStream(absolutePath);
        ObjectMetadata metadata = new ObjectMetadata();
        int indexOfLastDot = fileName.lastIndexOf(".");
        String suffix = fileName.substring(indexOfLastDot);
        metadata.setContentType(getContentType(suffix));
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        fileName = uuid + suffix;
        String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now());
        fileName = folder + datePath + "/" + fileName;
        PutObjectRequest putObjectRequest = new PutObjectRequest(aliYunOSSUtil.ossConfig.getBucket(), fileName, is);
        //设置ContentType,预览
        putObjectRequest.setMetadata(metadata);
        ossClient.putObject(putObjectRequest);
        url = "https://"
                + aliYunOSSUtil.ossConfig.getBucket()
                + "."
                + aliYunOSSUtil.ossConfig.getEndpoint()
                + "/"
                + fileName;
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return url;
}

/**
 * MultipartFile上传
 *
 * @param folder        目录需以正斜线结尾 如:"exampledir/"。
 * @param multipartFile multipartFile
 * @return
 */
@SneakyThrows
public static String upload(String folder, MultipartFile multipartFile) {
    InputStream inputStream = null;
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint(),
            aliYunOSSUtil.ossConfig.getAccessKeyId(), aliYunOSSUtil.ossConfig.getAccessKeySecret());
    String url = "";
    try {
        inputStream = multipartFile.getInputStream();
        String fileName = multipartFile.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        ObjectMetadata metadata = new ObjectMetadata();
        int indexOfLastDot = fileName.lastIndexOf(".");
        String suffix = fileName.substring(indexOfLastDot);
        fileName = uuid + suffix;
        String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now());
        // 拼接fileName , 文件夹1/文件夹2/文件名.jpg
        fileName = folder + datePath + "/" + fileName;
        metadata.setContentType(getContentType(suffix));
        PutObjectRequest putObjectRequest = new PutObjectRequest(aliYunOSSUtil.ossConfig.getBucket(), fileName, inputStream);
        //设置ContentType,预览
        putObjectRequest.setMetadata(metadata);
        ossClient.putObject(putObjectRequest);
        url = "https://"
                + aliYunOSSUtil.ossConfig.getBucket()
                + "."
                + aliYunOSSUtil.ossConfig.getEndpoint()
                + "/"
                + fileName;
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return url;
}

/**
 * 判断类型
 * @param suffix 文件后缀
 * @return
 */
private static String getContentType(String suffix) {
    if (suffix.equalsIgnoreCase(".bmp")) {
        return "image/bmp";
    }
    if (suffix.equalsIgnoreCase(".gif")) {
        return "image/gif";
    }
    if (suffix.equalsIgnoreCase(".jpeg") ||
            suffix.equalsIgnoreCase(".jpg") ||
            suffix.equalsIgnoreCase(".png")
    ) {
        return "image/jpg";
    }
    return "image/jpg";
}


/**
 * 列举 指定路径下所有的文件的文件名
 * 如果要列出根路径下的所有文件,path= ""
 *
 * @param path
 * @return
 */
public static List<String> listFileName(String path) {
    List<String> list = new ArrayList<>();
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    try {
        // 设置最大个数。
        final int maxKeys = 300;
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(aliYunOSSUtil.ossConfig.getBucket());
        // 设置prefix参数来获取path目录下的所有文件。
        listObjectsRequest.setPrefix(path);
        listObjectsRequest.setMaxKeys(maxKeys);
        // 列举文件。
        ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
        List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
        list = objectSummaries.stream().map(OSSObjectSummary::getKey).collect(Collectors.toList());
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return list;
}

/**
 * 列举文件下所有的文件url信息
 */
public static List<String> listFileUrl(String path) {
    List<String> res = new ArrayList<>();
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    try {
        // 构造ListObjectsRequest请求
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(aliYunOSSUtil.ossConfig.getBucket());
        // 设置prefix参数来获取目录下的所有文件。
        listObjectsRequest.setPrefix(path);
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        res = listing.getObjectSummaries().stream().map(objectSummary -> "https://"
                + aliYunOSSUtil.ossConfig.getBucket()
                + "." + aliYunOSSUtil.ossConfig.getEndpoint()
                + "/"
                + objectSummary.getKey()).map(String::toString).collect(Collectors.toList());
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return res;
}

/**
 * 判断文件是否存在
 *
 * @param objectName 填写不包含Bucket名称在内的Object完整路径,例如exampleobject.txt。
 * @return
 */
public static boolean isFileExist(String objectName) {
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    boolean flag = false;
    try {
        // 判断文件是否存在。如果返回值为true,则文件存在,否则存储空间或者文件不存在。
        // 设置是否进行重定向或者镜像回源。默认值为true,表示忽略302重定向和镜像回源;如果设置isINoss为false,则进行302重定向或者镜像回源。
        //boolean isINoss = true;
        flag = ossClient.doesObjectExist(aliYunOSSUtil.ossConfig.getBucket(), objectName);
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return flag;
}

/**
 * 通过文件名下载文件
 *
 * @param ossFileName   要下载的文件名
 * @param localFileName 本地要创建的文件名
 */
public static boolean downloadFile(String ossFileName, String localFileName) {
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    boolean flag = false;
    try {
        // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
        // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        ossClient.getObject(new GetObjectRequest(aliYunOSSUtil.ossConfig.getBucket(), ossFileName), new File(localFileName));
        flag = true;
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return flag;
}

/**
 * 批量删除文件或目录
 *
 * @param keys
 */
public static void deleteFiles(List<String> keys) {
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    try {
        DeleteObjectsResult deleteObjectsResult =
                ossClient.deleteObjects(new DeleteObjectsRequest(aliYunOSSUtil.ossConfig.getBucket()).withKeys(keys));
        deleteObjectsResult.getDeletedObjects();
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }


    ossClient.shutdown();
}

/**
 * 删除文件或目录
 *
 * @param objectName 填写文件完整路径。文件完整路径中不能包含Bucket名称。
 */
public static Boolean deleteFile(String objectName) {
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    ossClient.shutdown();
    boolean flag = false;
    try {
        // 删除文件或目录。如果要删除目录,目录必须为空。
        ossClient.deleteObject(aliYunOSSUtil.ossConfig.getBucket(), objectName);
        flag = true;
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return flag;
}

/**
 * 删除目录 (不建议用)
 * 非常危险!!!! 如果以下示例代码中前缀prefix的值为空字符串或者NULL,将会删除整个Bucket内的所有文件,请谨慎使用。
 *
 * @param prefix
 * @return
 */
public static boolean deleteFolder(String prefix) {
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    boolean flag = false;
    if (prefix == null || prefix.equals("")) {
        //传"" 会删除这个bucket 下所有文件,  谨慎!!
        return false;
    }
    try {
        // 删除目录及目录下的所有文件。
        String nextMarker = null;
        ObjectListing objectListing = null;
        do {
            ListObjectsRequest listObjectsRequest = new ListObjectsRequest(aliYunOSSUtil.ossConfig.getBucket())
                    .withPrefix(prefix)
                    .withMarker(nextMarker);
            objectListing = ossClient.listObjects(listObjectsRequest);
            if (objectListing.getObjectSummaries().size() > 0) {
                List<String> keys = objectListing.getObjectSummaries().stream().map(OSSObjectSummary::getKey).collect(Collectors.toList());
                DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(aliYunOSSUtil.ossConfig.getBucket()).withKeys(keys).withEncodingType("url");
                DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(deleteObjectsRequest);
                List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
                try {
                    for (String obj : deletedObjects) {
                        String deleteObj = URLDecoder.decode(obj, "UTF-8");
                        System.out.println("删除了:" + deleteObj);
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            nextMarker = objectListing.getNextMarker();
        } while (objectListing.isTruncated());
        flag = true;
    } catch (OSSException oe) {
        logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
        logger.error("Error Message:[{}]", oe.getErrorMessage());
        logger.error("Error Code:[{}]", oe.getErrorCode());
        logger.error("Request ID:[{}]", oe.getRequestId());
        logger.error("Host ID:[{}]", oe.getHostId());
    } catch (ClientException ce) {
        logger.error("客户端在尝试与OSS通信时遇到问题");
        logger.error("Error Message:[{}]", ce.getMessage());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
    return flag;

}


/**
 * 创建目录
 *
 * @param folder 填写目录名称,目录需以正斜线结尾 如:"exampledir/"。
 * @return
 */
public static boolean createFolder(String folder) {
    OSS ossClient = new OSSClientBuilder().build(aliYunOSSUtil.ossConfig.getEndpoint()
            , aliYunOSSUtil.ossConfig.getAccessKeyId()
            , aliYunOSSUtil.ossConfig.getAccessKeySecret());
    // 判断文件夹是否存在,不存在则创建
    boolean flag = false;
    if (!ossClient.doesObjectExist(aliYunOSSUtil.ossConfig.getBucket(), folder)) {
        try {
            String content = "";
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(aliYunOSSUtil.ossConfig.getBucket()
                    , folder, new ByteArrayInputStream(content.getBytes()));
            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);
            // 上传字符串。
            ossClient.putObject(putObjectRequest);
            flag = true;
        } catch (OSSException oe) {
            logger.error("请求已发送到OSS,但由于某种原因被拒绝并出现错误响应");
            logger.error("Error Message:[{}]", oe.getErrorMessage());
            logger.error("Error Code:[{}]", oe.getErrorCode());
            logger.error("Request ID:[{}]", oe.getRequestId());
            logger.error("Host ID:[{}]", oe.getHostId());
        } catch (ClientException ce) {
            logger.error("客户端在尝试与OSS通信时遇到问题");
            logger.error("Error Message:[{}]", ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
    return false;
}

}
`

posted @ 2023-04-06 14:48  Sappy  阅读(497)  评论(0编辑  收藏  举报