阿里云OSS存储服务
小编最近学习中遇到公司业务需要将附件存放在阿里云OSS存储服务器中,接下来就给大家简单介绍讲解一下OSS存储的介绍,用法和JAVA SpringBoot 项目的使用和代码实现。
有不足的地方欢迎大家评论区留言,一起进步。
引言
1.什么是阿里云OSS存储
阿里云对象存储 OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供最高可达 99.995 % 的服务可用性。多种存储类型供选择,全面优化存储成本。
优点:
安全性:阿里云OSS支持多种加密算法,能将用户数据进行加密存储,确保数据的保密性。同时,它还支持身份认证和权限控制功能,可以精确地控制用户对数据的访问权限。
可靠性:阿里云OSS基于阿里云自研的分布式系统架构,能自动将数据复制到不同的存储节点,使其具备高可靠性。即使某个存储节点发生故障,阿里云OSS也能自动切换到其他存储节点,保证数据的完整性。
高性能:阿里云OSS的访问速度快,可以为用户提供高性能的服务。它支持全球加速,能够将数据缓存在全球各地,实现全球负载均衡,提升访问速度。
2.开通OSS存储服务功能
2-1.登录阿里云平台,完成实名认证。
2-2.开通OSS存储服务
进入阿里云首页后再左上角产品处进行搜索 oss 打开
点击管理控制台
新建一个Bucket节点
新建成功后进入你的节点,这里就是存放上传的对象信息
点击概览查看节点信息
2-3.创建子账户
点击accessKey管理
注意:
继续使用AccessKey:选择这里使用的是你的当前登录的总账号,如有泄露则其他服务也会一起受影响(不推荐使用)
开始使用子账户:创建一个新的子账户,进行授权值针对于OSS存储服务
点击创建账户,进入创建账户界面
点击确定后会进行账户验证
注意:AccessKey ID,AccessKey Secret 务必妥善保管(只有在创建账户时候回显示,后面无法进行查看,自己找地方记住放好)
AccessKey ID:相当于你的子账户用户名
AccessKey Secret:相当于你的子账户密码
此时你的子账户已经创建成功。
2-4.给子账户添加OSS权限
点击确定,完成后在此查看此时账户已经存在OSS存储服务权限
阿里云OSS对象存储配置已经结束了,接下来就是大家期待的代码实现
代码实现
1.找到官方文档,参考官方文档进行开发
2.使用idea或者别的软件创建一个java项目
我这边使用的是idea 创建springboot项目,根据个人喜好
2-1导入依赖
如果你的 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>
2-2.创建工具类
下面的信息最好是放在 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 = "你自己的存储节点名称";
}
开始参考官方文档进行简单上传
赋值官方文档的上传或者使用下面我个人更改过得亦可
2-2-1.上传
@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;
}
}
2-2-2.删除
@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;
}
}
3.编写实现接口以及实现服务类
3-1.controller
@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);
}
}
3-2.service
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
1.启动项目打开测试工具
2.填写测试信息
3.选择附件发起调用接口
4.复制地址去浏览器访问即可
接下来的删除,下载接口自行测试,这边就不给大家一一测试了
其他
想要学习更多技能可参考阿里云官方文档进行学习,欢迎大家留言,指出不足。