锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-04-03 12:37:01 继电器底座dtf08a

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

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


本文速览:
1.案例介绍分布式零件存储常见解决方案
2.阿?云OSS介绍和打开对象存储
三、开阿?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.999999999%(12个9),服务设计的可用性不低于999.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>  

对应application.yml添加相应的配置

aliyun:   oss:     endpoint: ${你的endpoint}     access-key-id: ${你的access-key-id}     access-key-secret: ${你的access-key-secret}
    bucketname: ${你的bucketname}

添加阿里云oss配置类

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

对应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);
    }

}



对应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;
    }
}

postman测试


对应bucket也有对应的图片


本篇完!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章