大家好,我是工藤编程。 ?? | 一个正在努力学习的小博主,期待着你的关注 |
---|---|
作业侠系列最新文章 | 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也有对应的图片
本篇完!