资讯详情

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

大家好,我是工藤编程。 ?? 一个正在努力学习的小博主,期待着你的关注
作业侠系列最新文章 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(Object Storage Service)是阿云提供的海量, 云存储服务安全、低成本、持久。其数据设计的耐久性不低于 99.999999999%(12个9),服务设计的可用性不低于999.995%。 OSS与平台关闭RESTful API你可以在任何时候接受它 存储和访问任何类型的数据。 提供四种存储类型:标准、低频访问、归档和冷归档 各种数据存储场景: 在这里插入图片描述

有阿云账号,实名认证 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 进入以下页面后

点击概览

点击确定后,会有相应的对应 如下,记得保存好,以后用

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

以前盛的权限设计,其核是直接与权限挂钩 优点:开发简单方便 缺点:家庭与权限直接挂钩,导致授予复杂,分散,管理不便 例子:常?件系统权限设计, 直接给家庭加权

  • RBAC: Role Based Access Control

基于访问控制系统。权限与相关,家庭通过成为 合适的成员获得这些权限 优点:通过对家庭进入的分类,简化了家庭和权限的管理 ??与权限有关 缺点:开发对ACL相对复杂 例?:基于RBAC模型的权限验证框架与应对模型的权限验证框架相匹配 Apache Shiro、spring Security 总结:不要太复杂,规则太多,维护和性能会下降, 更多分 类 ABAC、PBAC等

  • RAM权限介绍

基于每种产品的权限,阿云RBAC、ACL模型包括简单管理账户、统一分配权限和集中控制资源 完善的资源控制体系。 众多产品,一般采购账户进入分配权限,防止攻击越权

添加依赖

<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也有对应的图片

本篇完!

标签: 继电器底座dtf08a

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

锐单商城 - 一站式电子元器件采购平台