首页 > 其他分享 >springboot阿里云oss工具类

springboot阿里云oss工具类

时间:2023-04-06 14:55:34浏览次数:59  
标签:return String ossConfig ossClient fileName 阿里 new oss springboot

pom依赖;

yml配置:

读取配置文件类:

上传:

完整工具类代码:

点击查看代码
`
import cn.hutool.core.lang.UUID;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import com.luzhizheng.common.config.OSSConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.URL;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

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

@Component
public class AliYunOSSUtil {
    @Autowired
    private OSSConfig ossConfig;

    private static String FOLDER = "文件夹";

    /**
     * 本地文件上传到oss
     * @param file
     * @return
     * @throws FileNotFoundException
     */
    public String upload(File file) throws FileNotFoundException {
        String absolutePath = file.getAbsolutePath();
        String fileName = file.getName();
        FileInputStream 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(ossConfig.getBucket(), fileName, is);
        //设置ContentType,预览
        putObjectRequest.setMetadata(metadata);
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        ossClient.putObject(putObjectRequest);
/*        //临时第三方授权
        Date expiration = new Date(System.currentTimeMillis() + 3600000L  * 24);
        URL url = ossClient.generatePresignedUrl(ossConfig.getBucket(), aimFilePathName, expiration);*/
        String url = "https://" + ossConfig.getBucket() + "." + ossConfig.getEndpoint() + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;
    }


    /**
     * multipartFile上传到oss
     * @param multipartFile
     * @return
     * @throws IOException
     */
    public String upload(MultipartFile multipartFile) throws IOException {
        InputStream inputStream = multipartFile.getInputStream();
        String fileName = multipartFile.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        fileName = uuid + fileName;
        String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now());
        // 拼接fileName , 文件夹1/文件夹2/文件名.jpg
        fileName = FOLDER + "/" + datePath + "/" + fileName;
        // 如果需要上传时设置存储类型与访问权限
        ObjectMetadata metadata = new ObjectMetadata();
        int indexOfLastDot = fileName.lastIndexOf(".");
        String suffix = fileName.substring(indexOfLastDot);
        metadata.setContentType(getContentType(suffix));
        PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfig.getBucket(), fileName, inputStream);
        //设置ContentType,预览
        putObjectRequest.setMetadata(metadata);
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        ossClient.putObject(putObjectRequest);
        /*        //临时第三方授权
        Date expiration = new Date(System.currentTimeMillis() + 3600000L  * 24);
        URL url = ossClient.generatePresignedUrl(ossConfig.getBucket(), aimFilePathName, expiration);*/
        String url = "https://" + ossConfig.getBucket() + "." + ossConfig.getEndpoint() + "/" + fileName;
        ossClient.shutdown();
        return url;
    }

    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 List<String> listFileName(String path) {
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossConfig.getBucket());
        // 设置prefix参数来获取path目录下的所有文件。
        listObjectsRequest.setPrefix(path);
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        // 列出文件。
        ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
        List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
        List<String> list = objectSummaries.stream().map(OSSObjectSummary::getKey).collect(Collectors.toList());
        ossClient.shutdown();
        return list;
    }

    /**
     * 列举文件下所有的文件url信息
     */
    public List<String> listFileUrl(String path) {
        List<String> res = new ArrayList<>();

        // 构造ListObjectsRequest请求
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossConfig.getBucket());

        // 设置prefix参数来获取fun目录下的所有文件。
        listObjectsRequest.setPrefix(path);

        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());

        // 列出文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有文件。

        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            //文件访问路径
            Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);
            URL url = ossClient.generatePresignedUrl(ossConfig.getBucket(), objectSummary.getKey(), expiration);
            res.add(url.toString());
        }
        // 关闭OSSClient。
        ossClient.shutdown();
        return res;
    }

    /**
     * 判断文件是否存在
     *
     * @param objectName
     * @return
     */
    public boolean isFileExist(String objectName) {
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        return ossClient.doesObjectExist(ossConfig.getBucket(), objectName);
    }

    /**
     * 通过文件名下载文件
     *
     * @param ossFileName    要下载的文件名
     * @param localFileName 本地要创建的文件名
     */
    public void downloadFile(String ossFileName, String localFileName) {
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());

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

    /**
     * 删除文件或目录
     *
     * @param objectName
     */
    public void deleteFile(String objectName) {
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        ossClient.deleteObject(ossConfig.getBucket(), objectName);
        ossClient.shutdown();
    }

    /**
     * 批量删除文件或目录
     *
     * @param keys
     */
    public void deleteFiles(List<String> keys) {
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        // 删除文件。
        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(ossConfig.getBucket()).withKeys(keys));
        deleteObjectsResult.getDeletedObjects();
        ossClient.shutdown();
    }

    /**
     * 创建文件夹
     *
     * @param folder
     * @return
     */
    public String createFolder(String folder) {
        // 文件夹名
        final String keySuffixWithSlash = folder;
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        // 判断文件夹是否存在,不存在则创建
        if (!ossClient.doesObjectExist(ossConfig.getBucket(), keySuffixWithSlash)) {
            // 创建文件夹
            ossClient.putObject(ossConfig.getBucket(), keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
            // 得到文件夹名
            OSSObject object = ossClient.getObject(ossConfig.getBucket(), keySuffixWithSlash);
            String fileDir = object.getKey();
            ossClient.shutdown();
            return fileDir;
        }
        return keySuffixWithSlash;
    }


}
`````

标签:return,String,ossConfig,ossClient,fileName,阿里,new,oss,springboot
From: https://www.cnblogs.com/Sappy/p/17292762.html

相关文章

  • 互联网项目实战——Athena-OSS分布式文件存储服务设计
    摘要在系统中需要有统一的存储系统,用于较大型的文件和图片进行存储,Athena系统中利用开源的FastDFS来构建Athena分布式文件存储系统OSS服务。用于整个系统的存储服务。博文将详细的介绍分布式存储系统的背景和意义以及相关的技术选型与原理,供大家学习参考。一、分布式文件存储系统背......
  • SpringBoot中如何编写一个优雅的限流组件?
    很早以前,我曾写过两篇介绍如何在SpringBoot中使用Guava和Redis实现接口限流的文章。具体包括:使用Guava实现单机令牌桶限流使用Redis实现分布式限流现在,一个问题摆在我们面前:如何将这两种限流机制整合到同一个组件中,以便用户随时切换呢?显然,我们需要定义一个通用的限流组件,将......
  • 阿里云短信服务开通(只限于测试,国内短信)
    阿里云短信服务开通(只限于测试,国内短信)前提:需要有阿里云的密钥--》AccessKeyID和AccessKeySecret是您访问阿里云API的密钥,具有该账户完全的权限第一步:搜索阿里云短信产品第2步:点击免费开通第3步:开通国内信息第4步:申请签名第5步:申请模板第6步:参考阿里云接口调......
  • springboot项目图片不显示的问题
    首先确认你的图片路径是对的那么大概率就是浏览器缓存的原因,因为页面直接用的是缓存的旧数据,所以显示不出来。再不修改浏览器设置的情况下,最简单的办法就是直接项目在pom.xml文件里引入devtools如下:<dependency><groupId>org.springframework.boot</groupId><artifactId>sp......
  • SpringBoot如何进行限流,老鸟们还可以这样玩!
    大家好,我是飘渺。在SpringBoot如何进行限流,老鸟们都这么玩的!一文中我们详细介绍了为什么需要对接口进行限流,也介绍了常见的限流算法,最后还基于Guava工具类实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis+Lua来实现分布式限流。Lua脚本......
  • Java SpringBoot Bean InitializingBean
    Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。Spring初始化bean有两种方式:实现InitializingBean接口,实现afterPropertiesSet方法。(比通过......
  • 解决在创建springboot项目中遇到:Error:(3, 32) java: 无法访问org.springframework.bo
    解决在创建springboot项目中遇到:Error:(3,32)java:无法访问org.springframework.boot.SpringApplication File--->ProjectStructure    选择对应版本        File--->Settings--->Build,Execution,Deployment    修改对应版本 ......
  • SpringBoot启动流程
    启动类@SpringBootApplicationpublicclassApp{publicstaticvoidmain(String[]args){ SpringApplication.run(App.class,args);}}@SpringBootApplication对于一个SpringBoot程序的启动首先需要一个加了@SpringBootApplication注解的启动类。@Spr......
  • Springboot整合Seata实现分布式事务
    前言Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。Seata配置非常灵活,支持多种注册中心、配置来源(配置中心)和持久化方式。本文选择eureka作注册中......
  • Springboot整合TX-LCN实现分布式事务
    前言TX-LCN是一款国产分布式事务协调框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。本文讲解如何使用Springboot作为基础,来配置使用TX-LCN。需要MySQL和Redis。名词解释TM(Tx-Manager/TransactionManager)事务协调者TC(Tx-Client......