系列文章目录

以下是专栏部分内容,更多内容请前往专栏查看!


SpringBoot整合阿里云OSS文件存储解决方案-LMLPHP


专栏推荐

  • 专门为Redis入门打造的专栏,包含Redis基础知识、基础命令、五大数据类型实战场景、key删除策略、内存淘汰机制、持久化机制、哨兵模式、主从复制、分布式锁等等内容。链接>>>>>>>>>《Redis从头学》
  • 专门为RabbitMQ入门打造的专栏,持续更新中。。。。。。。。链接>>>>>>>《图解RabbitMQ》

🌟前言

对于项目中的文件存储有两张方案,一种是存储在项目中,另一种则是采用分布式存储。第一种解决方案,随着文件数量越来越多,对于文件上传下载的带宽有影响并且对于以后存储的扩容有很大的不便性。本文来说一张分布式存储中的云厂商文件系统解决方案,有关于阿里云OSS文件上传的使用。

🌟介绍

它是具有与平台无关的Restful api接口。任何应用、时间、语言都可以访问。并且分为多种存储类型:标准存储类型、低频访问类型、归档访问类型、冷归档访问类型。其存储类型的数据热度从大到小一次为:标准、低频、归档、冷归档。

🌟准备

1.创建bucket。这里要注意读写权限选择公共读。这里截图截错了。
SpringBoot整合阿里云OSS文件存储解决方案-LMLPHP
2.创建用户RAM权限。注意复制key,只会出现一次
SpringBoot整合阿里云OSS文件存储解决方案-LMLPHP

🌟引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

🌟配置文件

进入实例查看endpoint:
SpringBoot整合阿里云OSS文件存储解决方案-LMLPHP

aliyun:
  oss:
    endpoint: oss-cn-beijing.aliyuncs.com
    access-key-id: 你复制的accessID
    access-key-secret: 你复制的keyScret
    bucketname: 你创建的buckert名称

🌟配置类

创建OSS配置类,读取配置文件中的内容。

@ConfigurationProperties(prefix = "aliyun.oss")
@Configuration
@Data
public class OssConfig {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

🌟文件上传组件-service层

上传流程:采用multipartFile。

  1. 读取OSSConfig配置类中的配置。
  2. 根据读取到的endpoint、accesskeyID、accessScret创建OSS客户端实例Ossclient。
  3. 配置实例参数。
  4. 获取上传的文件名、拓展名;定义上传后的文件名。
  5. 拼接路径
  6. 返回上传后的路径地址。
 @Autowired
    private OSSConfig ossConfig;

    /**
     * oss上传文件
     * 1.创建oss客户端实例
     * 2.配置实例参数
     * 3.拼接路径
     * @param file
     * @return
     */
    @Override
    public String uploadFile(MultipartFile file) {
        String endPoint=ossConfig.getEndpoint();
        String accessKeyId=ossConfig.getAccessKeyId();
        String accessKeyScret=ossConfig.getAccessKeySecret();
        String bucketName= ossConfig.getBucketName();
        //创建ossClient实例
        OSS ossClient= new OSSClientBuilder().build(endPoint,accessKeyId,accessKeyScret);
        //拼接路径
        String originFileName=file.getOriginalFilename();
        DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy/mm/dd");
        LocalDateTime localDateTime=LocalDateTime.now();
        //根据日期分类文件夹
        String folderName=dtf.format(localDateTime);
        //新文件名
        String newFileName= CommonUtil.getRandom(4);
        //获取拓展名
        String extension=originFileName.substring(originFileName.lastIndexOf("."));
        String newFile="user/"+folderName+"/"+newFileName+extension;
        //推送
        try {
            PutObjectResult result = ossClient.putObject(bucketName, newFile, file.getInputStream());
            if (result!=null){
                return "https://"+endPoint+"."+bucketName+"."+"/"+newFile;
            }
        } catch (IOException e) {
            throw new SelfException(GlobalExceptionEnum.FILE_UPLOAD_ERROR);
        }finally {
            ossClient.shutdown();
        }
        return null;
    }

🌟上传文件接口

  /**
     * 头像上传
     * @param file 上传的文件
     * @return
     */
    @ApiOperation("头像上传")
    @PostMapping("upload")
    public JsonResult upload(@ApiParam(value = "文件") @RequestPart(value = "file")MultipartFile file){
        String path = fileService.uploadFile(file);
        if (StringUtils.isBlank(path)){
            return JsonResult.exceptionResponse(GlobalExceptionEnum.FILE_UPLOAD_ERROR);
        }
        return JsonResult.success("上传成功",path);
    }

🌟写在最后

有关于SpringBoot整合阿里云OSS实现文件上传介绍到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


SpringBoot整合阿里云OSS文件存储解决方案-LMLPHP

10-01 00:15