• 【SpringBoot实战系列】阿里云OSS接入上传图片实战


    大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
    作业侠系列最新文章😉Java实现聊天程序
    SpringBoot实战系列🐷SpringBoot实战系列之图形验证码开发并池化Redis6缓存
    环境搭建大集合环境搭建大集合(持续更新)

    在本栏中,我们之前已经完成了:
    SpringBoot实战系列之发送短信验证码
    SpringBoot实战系列之从Async组件应用实战到ThreadPoolTaskExecutor⾃定义线程池
    SpringBoot实战系列之图形验证码开发并池化Redis6存储


    本文速览:
    1.分布式⽂件存储常⻅解决⽅案介绍
    2.阿⾥云OSS对象存储介绍和开通
    3.开通阿⾥云OSS
    4.实战阿⾥云OSS对象存储客户端集成和测试服务

    说明:阿里云oss为按量付费,个人学习使用几乎等于白嫖,开通不要钱

    分布式⽂件存储常⻅解决⽅案介绍
    ⽬前业界比较多这个解决⽅案,这边就挑选⼏个介绍下

    • MinIO

    是在 Apache License v2.0 下发布的对象存储服务器,学习成本低,安装运维简单,主流语⾔的客户端整合都有, 号称最强的对象存储⽂件服务器,且可以和容器化技术docker/k8s等结合,社区活跃但不够成熟,业界参考资料较少
    官⽹:https://docs.min.io/cn/

    • FastDFS

    ⼀个开源的轻量级分布式⽂件系统,⽐较少的客户端可以整合,⽬前主要是C和java客户端,在⼀些互联⽹创业公司中有应⽤⽐较多,没有官⽅⽂档,社区不怎么活跃.
    架构+部署结构复杂,出问题定位⽐较难定位,可以说是fastdfs零件的组装过程,需要去理解fastDFS的架构设计,才能够正确的安装部署

    • 云⼚商

    阿⾥云OSS
    七⽜云
    腾讯云
    亚⻢逊云
    CDN最强:Akamai https://www.akamai.com/cn
    选云⼚商理由
    优点:开发简单,功能强⼤,容易维护(不同⽹络下图⽚质量、⽔印、加密策略、扩容、加速)
    缺点:要钱, 个性化处理,未来转移⽐较复杂,不排除有些⼚商会提供⼀键迁移⼯具
    选开源MinIO的理由
    优点:功能强⼤、可以根据业务做⼆次的定制,新⼀代分布式⽂件存储系统,容器化结合强⼤,更重要的是免费(购买磁盘、内存、带宽)
    缺点:⾃⼰需要有专⻔的团队进⾏维护、扩容等⽂件

    • 上传流程
      web控制台
      前端->后端程序->阿⾥云OSS

    阿⾥云OSS对象存储介绍和开通

    对象存储OSS(Object Storage Service)是阿⾥云提供的海量、
    安全、低成本、⾼持久的云存储服务。其数据设计持久性不低于
    99.9999999999%(12个9),服务设计可⽤性不低于99.995%。
    OSS具有与平台⽆关的RESTful API接⼝,您可以在任何应⽤、任何时
    间、任何地点存储和访问任意类型的数据。
    提供标准、低频访问、归档和冷归档四种存储类型,全⾯覆盖从热到冷
    的各种数据存储场景:
    在这里插入图片描述

    开通阿⾥云OSS
    有阿⾥云账号、实名认证
    OSS介绍:https://www.aliyun.com/product/oss
    OSS控制台:https://oss.console.aliyun.com/bucket
    学习路径:https://help.aliyun.com/learn/learningpath/oss
    .html

    说明:阿里云oss为按量付费,个人学习使用几乎等于白嫖,开通不要钱,购买之后直接根据上面控制台链接复制到浏览器打开即可

    创建bucket
    在这里插入图片描述
    点击创建好的bucket
    在这里插入图片描述
    进入以下页面后

    点击概览
    在这里插入图片描述

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    点击确定后,会有对应
    在这里插入图片描述如下,记得保存好,后面会用

    权限知识 RBAC-ACL模式应⽤之阿⾥云RAM访问控制

    • ACL: Access Control List 访问控制列表

    以前盛⾏的⼀种权限设计,它的核⼼在于⽤户直接和权限挂钩
    优点:简单易⽤,开发便捷
    缺点:⽤户和权限直接挂钩,导致在授予时的复杂性,⽐较分散,不便于管理
    例⼦:常⻅的⽂件系统权限设计, 直接给⽤户加权限

    • RBAC: Role Based Access Control

    基于⻆⾊的访问控制系统。权限与⻆⾊相关联,⽤户通过成为
    适当⻆⾊的成员⽽得到这些⻆⾊的权限
    优点:简化了⽤户与权限的管理,通过对⽤户进⾏分类,使得
    ⻆⾊与权限关联起来
    缺点:开发对⽐ACL相对复杂
    例⼦:基于RBAC模型的权限验证框架与应⽤ Apache Shiro、spring Security
    总结:不能过于复杂,规则过多,维护性和性能会下降, 更多分
    类 ABAC、PBAC等

    • RAM权限介绍

    阿⾥云⽤于各个产品的权限,基于RBAC、ACL模型都有,进⾏简单管理账号、统⼀分配权限、集中管控资源,从⽽建⽴安
    全、完善的资源控制体系。
    众多产品,⼀般采⽤⼦账号进⾏分配权限,防⽌越权攻击

    实战阿⾥云OSS对象存储客户端集成和测试服务
    添加依赖

    <dependency>
     
    <groupId>com.aliyun.oss</groupId>
     <artifactId>aliyun-sdkoss</artifactId>
     <version>3.10.2</version>
     </dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    对应application.yml中添加对应配置

    aliyun:
      oss:
        endpoint: ${你的endpoint}
        access-key-id: ${你的access-key-id}
        access-key-secret: ${你的access-key-secret}
        bucketname: ${你的bucketname}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    添加阿里云oss配置类

    @ConfigurationProperties(prefix = "aliyun.oss")
    @Configuration
    @Data
    public class OSSConfig {
     private String endpoint;
     private String accessKeyId;
     private String accessKeySecret;
     private String bucketname;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    对应controller开发

    @RestController
    @RequestMapping("/api/v1/account")
    public class AccountController {
    
        @Autowired
        private FileService fileService;
    
        @PostMapping("upload")
        public JsonData uploadHeaderImg(@RequestPart("file")MultipartFile file){
            String result = fileService.uploadUserHeadImg(file);
            return result == null ? JsonData.buildResult(BizCodeEnum.FILE_UPLOAD_USER_IMG_FAIL) : JsonData.buildSuccess(result);
        }
    
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    对应service开发

    @Service
    @Slf4j
    public class FileServiceImpl implements FileService {
    
        @Autowired
        private OSSConfig ossConfig;
    
        /**
         *文件上传阿里云oss
         * 1.获取阿里云oss配置
         * 2.创建OSS ossClient
         * 3.格式化上传的文件目录,方便管理
         * 4.将用户上传的头像推到阿里云oss并得到图片url
         * 5.将图片url返回给前端,后面注册再一起同表单提交过来
         */
        @Override
        public String uploadUserHeadImg(MultipartFile file) {
    
            String bucketName = ossConfig.getBucketname();
            String endpoint = ossConfig.getEndpoint();
            String accessKeyId  = ossConfig.getAccessKeyId();
            String accessKeySecret = ossConfig.getAccessKeySecret();
            String originalFileName = file.getOriginalFilename();
            OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
    
            LocalDateTime ldt = LocalDateTime.now();
            DateTimeFormatter dtf =DateTimeFormatter.ofPattern("yyyy/MM/dd");
            String folder = dtf.format(ldt);
    
            String fileName = CommonUtil.generateUUID();
    
            String extension = originalFileName.substring(originalFileName.lastIndexOf("."));
            if(!(extension.equalsIgnoreCase(".jpg") || extension.equalsIgnoreCase(".jpeg") || extension.equalsIgnoreCase(".png"))){
                log.info("类型不支持{}",extension);
                return null;
            }
    
            String newFileName = "user/"+folder+"/"+fileName+extension;
    
            try {
                PutObjectResult putObjectResult =  ossClient.putObject(bucketName, newFileName, file.getInputStream());
                if(putObjectResult != null){
                    String imgUrl =  "https://"+bucketName+"."+endpoint+"/"+newFileName;
                    return imgUrl;
                }
            }catch (IOException e){
                log.error("上传文件失败:{}",e);
            }
            finally {
                ossClient.shutdown();
            }
            return null;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    postman测试

    在这里插入图片描述
    对应bucket也有对应的图片

    在这里插入图片描述
    本篇完!

  • 相关阅读:
    ChatGPT 总结数据分析的所有知识点
    电子学会C/C++编程等级考试2021年12月(一级)真题解析
    Element Plus阻止 el-dropdown、el-switch等冒泡事件
    基于Hadoop架构的可视化大数据挖掘建模平台
    区块链中的函数(solidity0.8.13)
    LeetCode-组合总和(C++)
    Pytorch中如何加载数据、Tensorboard、Transforms的使用
    一天销量200万,国产5G手机20天才200万,挑战iPhone也就想想罢了
    亚马逊云科技与德勤中国推出新工具,有效缓解生成式AI时代下的安全问题
    MFC 静态库导入,动态库导入方式
  • 原文地址:https://blog.csdn.net/chandfy/article/details/125964159