赞
踩
小编最近学习中遇到公司业务需要将附件存放在阿里云OSS存储服务器中,接下来就给大家简单介绍讲解一下OSS存储的介绍,用法和JAVA SpringBoot 项目的使用和代码实现。
有不足的地方欢迎大家评论区留言,一起进步。
阿里云对象存储 OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供最高可达 99.995 % 的服务可用性。多种存储类型供选择,全面优化存储成本。
优点:
安全性:阿里云OSS支持多种加密算法,能将用户数据进行加密存储,确保数据的保密性。同时,它还支持身份认证和权限控制功能,可以精确地控制用户对数据的访问权限。
可靠性:阿里云OSS基于阿里云自研的分布式系统架构,能自动将数据复制到不同的存储节点,使其具备高可靠性。即使某个存储节点发生故障,阿里云OSS也能自动切换到其他存储节点,保证数据的完整性。
高性能:阿里云OSS的访问速度快,可以为用户提供高性能的服务。它支持全球加速,能够将数据缓存在全球各地,实现全球负载均衡,提升访问速度。
进入阿里云首页后再左上角产品处进行搜索 oss 打开
点击管理控制台
新建一个Bucket节点
新建成功后进入你的节点,这里就是存放上传的对象信息
点击概览查看节点信息
点击accessKey管理
注意:
继续使用AccessKey:选择这里使用的是你的当前登录的总账号,如有泄露则其他服务也会一起受影响(不推荐使用)
开始使用子账户:创建一个新的子账户,进行授权值针对于OSS存储服务
点击创建账户,进入创建账户界面
点击确定后会进行账户验证
注意:AccessKey ID,AccessKey Secret 务必妥善保管(只有在创建账户时候回显示,后面无法进行查看,自己找地方记住放好)
AccessKey ID:相当于你的子账户用户名
AccessKey Secret:相当于你的子账户密码
此时你的子账户已经创建成功。
点击确定,完成后在此查看此时账户已经存在OSS存储服务权限
阿里云OSS对象存储配置已经结束了,接下来就是大家期待的代码实现
我这边使用的是idea 创建springboot项目,根据个人喜好
如果你的 jdk版本是9及以上的选择下面的
我这边使用的是 jdk1.8 版本 springboot 为 2.3.7.RELEASE
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.3.7.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <!--lombok-->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- <!--阿里云OSS云存储服务-->
- <dependency>
- <groupId>com.aliyun.oss</groupId>
- <artifactId>aliyun-sdk-oss</artifactId>
- <version>3.15.1</version>
- </dependency>
- </dependencies>
下面的信息最好是放在 resources下的yml文件中,运行项目读取使用
- @Slf4j
- @Component
- public class OSSUtils {
-
- //云存储oss的阿里云账户 AccessKey
- private static final String access_key = "你自己保存的AccessKey";
- //云存储oss的阿里云账户 AccessKeySecret
- private static final String access_key_secret = "你自己保存的AccessKeySecret";
- //地域节点
- private static final String endpoint = "上面外网访问的地域节点";
- //oss存储节点名称
- private static final String bucket_name = "你自己的存储节点名称";
-
- }
开始参考官方文档进行简单上传
赋值官方文档的上传或者使用下面我个人更改过得亦可
- @Slf4j
- @Component
- public class OSSUtils {
- /*
- * @阿里云 OSS存储 : 上传附件
- * */
- public Map<String, String> up_file(MultipartFile file) {
-
- Map<String, String> map = new HashMap<>();
-
- //获取原附件名
- String filename = file.getOriginalFilename();
- //截取原附件后缀
- String suffex = filename.substring(filename.lastIndexOf("."));
-
- // 设置上传到OSS文件的分包路径,可置空此项。置空后,文件将上传至Bucket的根目录下。
- String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
- String dir = format + "/";
-
- //防止上传附件覆盖 - 使用uuid
- String uuid = UUID.randomUUID().toString().replace("-", "");
- String url_file_name = dir + uuid + suffex;
-
- /*
- * host(杭州)为例,其它Region请按实际情况填写。
- * 填写Host名称,格式为 https://sling-guli-mall.oss-cn-nanjing.aliyuncs.com/gd.jpg
- * */
- String host = "https://" + bucket_name + "." + endpoint;//可有可无
- // 创建OSSClient实例。
- OSS oss_client = new OSSClientBuilder().build(endpoint, access_key, access_key_secret);
- // 获取上传文件的输入流
- InputStream inputStream = null;
- try {
- inputStream = file.getInputStream();
- } catch (IOException e) {
- throw new CustomException("oss存储附件输入流异常:" + e);
- }
- //调用OSS方法实现上传
- oss_client.putObject(bucket_name, url_file_name, inputStream);
- // 关闭OSSClient
- oss_client.shutdown();
-
- //把上传之后文件路径返回
- //需要把上传到阿里云oss路径手动拼接出来,返回前端或者保存数据库以便后续访问
- String url = "https://" + bucket_name + "." + endpoint + "/" + url_file_name;
- map.put("uuid_name", uuid + suffex);
- map.put("url_name", url_file_name);
- map.put("url", url);
- return map;
- }
- }
- @Slf4j
- @Component
- public class OSSUtils {
- /*
- * @阿里云 OSS存储 : 删除附件
- * */
- public boolean del_file(String file_name) {
-
- // 创建OSSClient实例。
- OSS oss_client = new OSSClientBuilder().build(endpoint, access_key, access_key_secret);
-
- try {
- oss_client.deleteObject(bucket_name, file_name);
- } catch (Exception e) {
- log.info("阿里云 oss 存储删除附件异常 -> {}", e);
- throw new CustomException("删除附件异常!");
- } finally {
- oss_client.shutdown();
- }
- log.info("阿里云 oss 存储删除附件 ok");
-
- return true;
- }
- }
2-2-3.下载
注意:下载附件时要确保你本地保存附件路径存在,不存在则手动创建或代码创建文件夹,我这里采用的是代码自动判断创建
- @Slf4j
- @Component
- public class OSSUtils {
-
- /*
- * @阿里云 OSS存储 : 下载附件
- * 注意: 下载附件时先判断附件保存路径的文件夹是否存在,不存在则先去创建保存路径文件夹
- * */
- public boolean download_file(String file_name, String url) {
-
- // 创建OSSClient实例。
- OSS oss_client = new OSSClientBuilder().build(endpoint, access_key, access_key_secret);
-
- // 转换路径中的 \ -> /
- url= url.replace("\\","/");
- //判断路径末尾是否存在 / 不存在则添加一个
- if (url.length() - 1 != url.lastIndexOf("/")) {
- url = url + "/";
- }
-
- //截取附件名称前面的路径地址
- String substring = file_name.substring(0, file_name.indexOf("/"));
- //文件夹不存在则创建文件夹
- String ins_url = url + substring + "/";
- File file = new File(ins_url);
- if (!file.exists()){
- try {
- file.mkdir();
- }catch (Exception e){
- e.fillInStackTrace();
- }
- }
-
- //下载附件的 完整路径
- String over_url = url + file_name;
- try {
-
- //附件下载
- oss_client.getObject(new GetObjectRequest(bucket_name, file_name), new File(over_url));
- } catch (Exception e) {
- log.info("阿里云 oss 存储下载附件异常 -> {}", e);
- throw new CustomException("下载附件异常!");
- } finally {
- oss_client.shutdown();
- }
- log.info("阿里云 oss 存储下载附件 ok");
- return true;
- }
- }
- @RestController
- @RequestMapping("/utils")
- public class UtilsController {
-
- @Resource
- private UtilsService utilsService;
-
- @ApiOperation("阿里云oss上传附件")
- @PostMapping("/aliyu_oss_up_file")
- public DateCode aliyu_oss_up_file(@RequestParam("file") MultipartFile multipartFile){
- return utilsService.aliyu_oss_up_file(multipartFile);
- }
- @ApiOperation("阿里云oss删除附件")
- @GetMapping("/aliyu_oss_del_file")
- public DateCode aliyu_oss_del_file(String fileName){
- return utilsService.aliyu_oss_del_file(fileName);
- }
-
- @ApiOperation("阿里云oss下载附件")
- @PostMapping("/aliyu_oss_del_file")
- public DateCode aliyu_oss_down_file(@RequestParam("fileName") String fileName,@RequestParam("url") String url){
- return utilsService.aliyu_oss_download_file(fileName,url);
- }
-
- }
- public interface UtilsService {
-
- DateCode aliyu_oss_up_file(MultipartFile multipartFile);
-
- DateCode aliyu_oss_del_file(String fileName);
-
- DateCode aliyu_oss_download_file(String fileName, String url);
-
- }
3-3.service-impl
参数校验,返回值校验等校验规则我这边就不展示了(显得臃肿),根据自己的业务去做判断即可。
- @Slf4j
- @Service
- public class UtilsServiceImpl implements UtilsService {
-
- //使用注解注入依赖
- @Resource
- private OSSUtils ossUtils;
-
- @Override
- public DateCode aliyu_oss_up_file(MultipartFile multipartFile) {
- Map<String, String> map = ossUtils.up_file(multipartFile);
- map.put("size",multipartFile.getSize());
- return DateCode.success("OSS存储上传附件成功", map);
- }
-
- @Override
- public DateCode aliyu_oss_del_file(String fileName) {
- boolean b = ossUtils.del_file(fileName);
- if (!b) {
- return DateCode.error("OSS存储删除附件失败");
- }
- return DateCode.success("OSS存储删除附件成功");
- }
-
- @Override
- public DateCode aliyu_oss_download_file(String fileName, String url) {
- boolean b = ossUtils.download_file(fileName, url);
- if (!b) {
- return DateCode.error("OSS存储下载附件失败");
- }
- return DateCode.success("OSS存储下载附件成功");
- }
-
- }
可使用 Swagger 在浏览器自行测试
我这边使用的测试软件是Postmain
接下来的删除,下载接口自行测试,这边就不给大家一一测试了
想要学习更多技能可参考阿里云官方文档进行学习,欢迎大家留言,指出不足。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。