springboot 集成阿里云oss

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 集成阿里云oss相关的知识,希望对你有一定的参考价值。

参考技术A 对象存储服务(Object Storage Service,简称OSS)

对象存储,也叫做基于对象的存储,是用来描述解决和处理离散单元的方法的通用术语,这些离散单元被称作为对象。
服务就是,给你提供对象存储,这项服务了。
当然不要认为只要一家 阿里云oss,国内很多,只是铺天盖地都是他的广告而已。

两种方式,
一种是后台提供接口,让前端或其他子系统调用,不需要他接触我使用的什么方法和储存的配置东西,就给一个文件进行放入到oss 里面
两种,后台值提高配置接口,剩下的你就这几调用他们的sdk里面内容就可以了。例如阿里云的就直接使用androidios sdk 配置就行了,你需要什么参数,我都会给你的。

所以介于这两种写的东西也不一样,各个工程师的理解也不一样。

所以这样很简单了不少,这样就封装成一个bean 就可以了。

使用

接着就api 的使用了。。。
不同的 sdk存储方法不一样,参数也不一样。
这个是里java 直接 使用

还是原文档好点。这里这写流程了,因为思路比什么都重要。

后台工作量打一些,
写入两个方法就行,一个上传文件,一个删除文件

删除

上传文件,是前台上传的时候用,删除,是他要删除的,你主动去调用。

不同平台使用不同的sdk ,就需要知道他们参数就可以了就行。
例如ios

需要五个参数

两个参数
上传

原来和ios 一样,直接android 重构OSSFederationCredentialProvider 实现

就可以了,一个接口就行了。
就给他结果就行了

阿里云有三种方式权限

案例使用的是sts 方法。
阿里云STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务。RAM提供RAM用户和RAM角色两种身份。其中,RAM角色不具备永久身份凭证,而只能通过STS获取可以自定义时效和访问权限的临时身份凭证,即安全令牌(STS Token)。

expiration 就是过期的时间。

springboot阿里云oss工具类

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;
    



`````

以上是关于springboot 集成阿里云oss的主要内容,如果未能解决你的问题,请参考以下文章

springboot阿里云oss工具类

thinkphp集成系列之阿里云oss

thinkphp集成系列之阿里云oss

SpringBoot上传文件到阿里云OSS

JEESZ分布式架构集成阿里云OSS存储

Springboot上传文件到阿里云对象存储OSS的几种常用方法