持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
作者平台:
| CSDN:blog.csdn.net/qq_41153943…
| 知乎:www.zhihu.com/people/1024…
| GitHub:github.com/JiangXia-10…
| 微信公众号:1024笔记
本文一共2339字,预计阅读10分钟
前言
在公司的一些业务场景中,关于视频、图片等一些数据的存储并非是存在本地的文件服务器中,使用的是阿里云的对象存储OSS。今天就一起简单的学习阿里云的对象存储服务。
什么是阿里云对象存储服务
OSS全称是Object Storage Service,即对象存储服务。为了解决海量数据存储与弹性扩容,在很多的项目和业务场景中,很多公司都会采用云存储的解决方案。阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,能够提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。
如何开通OSS
开通阿里云的OSS需要以下步骤:
首先需要的肯定是要有阿里云的账号,如果没有得先申请一个并且完成实名认证,然后根据以下步骤开通“对象存储OSS”服务:
开通之后进入管理控制台界面:
注:这里建议先充值一块钱,用于一些微量扣费,如果只是作为学习使用,实际产生得费用很低,所以一块钱能够足够使用了。
创建Bucket
Bucket中文名即水桶、桶。这里可以看成windows的系统盘,我们创建一个bucket就类似于创建了一个c盘、d盘等等。创建Bucket的过程如下:
需要输入创建的bucket的名称,根据自己的实际需要填写,地域也根据自己的区域选择,其他的基本都可以使用默认选择,比如存储类型:标准存储/低频存储;同城冗余存储:进行备份,开通收费;版本控制:不开通;读写权限:公共读;实时日志查询:不开通。
获取AccessKey
如果需要在项目中使用OSS,那么还有需要使用的是AccessKey:
然后需要通过账号绑定的手机号验证,然后查看Secret。
实际开发
接下来就演示如何在项目中使用阿里云的OSS。具体可以参考阿里云oss的官方文档:
首先需要在项目中导入阿里云oss的相关依赖:
<!--aliyunOSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
然后配置配置application.properties,主要需要配置的参数是endpoint(节点即刚刚创建的bucket的地域)、bucketName(刚刚创建的bucket的名字)、accessKeyId和accessKeySecret就是刚刚查看Secret的密钥的内容,具体根据自己的实际进行配置:
#服务端口
server.port=8002
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=your endpoint
aliyun.oss.file.keyid=your accessKeyId
aliyun.oss.file.keysecret=your accessKeySecret
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=your bucket
接下来需要做的就是实现文件上传至阿里云OSS。
创建一个工具类,从配置文件读取oss配置常量。这里使用@Value读取配置文件中的内容。
用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用,具体代码如下:
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//当项目已启动,spring接口,spring加载之后,执行接口一个方法implements InitializingBean
@Component
public class ConstantPropertiesUtil implements InitializingBean {
//@Value读取配置文件内容,自动注入
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
//定义公开静态常量
public static String END_POIND;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POIND = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
然后创建一个service接口用于文件上传:
public interface FileService {
/**
* 文件上传至阿里云
* @param file
* @return
*/
String upload(MultipartFile file);
}
创建一个该接口的实现类,实现具体的文件上传核心逻辑,具体可以参考sdk官方文档:
public class FileServiceImpl implements FileService {
@Override
public String upload(MultipartFile file) {
//获取阿里云存储相关常量
String endPoint = ConstantPropertiesUtil.END_POINT;
String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
String fileHost = ConstantPropertiesUtil.FILE_HOST;
String uploadUrl = null;
try {
//判断oss实例是否存在:如果不存在则创建,如果存在则获取
OSSClient ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
if (!ossClient.doesBucketExist(bucketName)) {
//创建bucket
ossClient.createBucket(bucketName);
//设置oss实例的访问权限:公共读
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
}
//获取上传文件流
InputStream inputStream = file.getInputStream();
//构建日期路径:picture/2022/06/19/文件名
String filePath = new DateTime().toString("yyyy/MM/dd");
//文件名:uuid.扩展名
String original = file.getOriginalFilename();
//随机uuid
String fileName = UUID.randomUUID().toString();
String fileType = original.substring(original.lastIndexOf("."));
String newName = fileName + fileType;
String fileUrl = fileHost + "/" + filePath + "/" + newName;
//文件上传至阿里云
ossClient.putObject(bucketName, fileUrl, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//获取url地址
uploadUrl = "http://" + bucketName + "." + endPoint + "/" + fileUrl;
} catch (IOException e) {
throw new JiangxiaException(ResultCodeEnum.FILE_UPLOAD_ERROR);
}
return uploadUrl;
}
}
controller代码实现如下:
@Api(description="阿里云OSS学习")
@RestController
@RequestMapping("/jiangxia/oss/file")
public class FileController {
@Autowired
private FileService fileService;
@ApiOperation(value = "文件上传")
@PostMapping("upload")
public ResultData upload(
@ApiParam(name = "file", value = "文件", required = true)
@RequestParam("file") MultipartFile file) {
String uploadUrl = fileService.upload(file);
//返回r对象
return ResultData.ok().message("文件上传成功").data("url", uploadUrl);
}
}
启动项目,使用postman或者SwaggerUI进行接口文件上传测试,可以正常将自己的文件上传至阿里云oss中自己使用的Bucket列表中,并且根据实际进行分组:
总结
以上就是如何申请阿里云的oss服务以及如何在项目中具体使用,其核心就是bucket的创建。每次文件上传都是上传至具体的bucket中,并且可以根据自己代码得了逻辑进行分组和命名,代码的核心就是endpoint、bucketName、accessKeyId和accessKeySecret这四个参数的使用,具体的核心代码基本可以参考sdk的帮助文档进行核心参数的替换即可。