前言
为了解决海量数据存储与弹性扩容,我们一般采用云存储的解决方案-阿里云OSS。
一、阿里云OSS是什么?
可直接搜索阿里云官网,申请阿里云账号并进行实名认证
搜索对象存储OSS,并开通服务
点击进入后立即开通并管理控制台(我这里已经开通)
来到这个页面后,我们点击【创建Bucket】
Bucket 的中文意思是桶,桶是用来干嘛的?当然是装东西的。也就是官方说的存储空间。
你可以理解为你电脑中的C盘、D盘、E盘等。
可根据具体需求来选择相应业务项
Bucket创建完成后,记住Endpoint。阿里云的OSS只是一个服务,我们要使用服务,需要 AccessId 和 AccessKey 进行授权。不光是阿里接口,几乎所有API接口都有这一步。右上角查看AccessKey 和AccessKey Secret。
第一次创建,会弹出这个东西。一般来说,个人的数据没有那么必要折腾,选择【继续使用AccessKey】。而如果是公司用的话,基于安全原因,一般选择【开始使用字用户AccessKey】
二、测试Bucket
引入相关依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
测试创建Bucket的连接。其中:
- endpoint :创建Bucket后概览页面获取
- accessKeyId :可由右上角个人信息中AccessKey管理获取
- accessKeySecret :可由右上角个人信息中AccessKey管理获取
- bucketName :创建Bucket时的名称
public class TestOSS {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "your-endpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "your-accessKeyId ";
String accessKeySecret = "your-accessKeySecret ";
// 填写Bucket名称,例如examplebucket。
String bucketName = "your-bucketName ";
@Test
public void testCreateBucket() {
// 创建OSSClient实例
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 创建存储空间
ossClient.createBucket(bucketName);
// 关闭ossClient
ossClient.shutdown();
}
}
显示如下所示,则Bucket可连接
判断存储空间是否存在
@Test
public void testExist() {
// 创建OSSClient实例
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
boolean exist = ossClient.doesBucketExist(bucketName);
System.out.println(exist);
// 关闭ossClient
ossClient.shutdown();
}
三、文件上传
配置application.properties
#服务端口
server.port=8080
# 应用名称
spring.application.name=OssDemo01
#阿里云 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 BucketName
从配置文件读取常量
创建常量读取工具类:ConstantPropertiesUtil.java
使用@Value读取application.properties里的配置内容
用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。
/**
* 常量类,读取配置文件application.properties中的配置
*/
@Component
//@PropertySource("classpath:application.properties")
public class ConstantPropertiesUtil implements InitializingBean {
@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.filehost}")
private String fileHost;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
public static String FILE_HOST ;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
FILE_HOST = fileHost;
}
}
创建service接口
public interface IFileService {
/**
* 文件上传至阿里云
* @param file
* @return
*/
String upload(MultipartFile file);
}
实现接口
@Service
public class FileService Impl implements IFileService {
@Override
public String upload(MultipartFile file) {
//工具类获取值
String endpoint = ConstantPropertiesUtil.END_POIND;
String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流
InputStream inputStream = file.getInputStream();
//获取文件名称
String fileName = file.getOriginalFilename();
//存在问题:多次上传相同文件的名称,造成最后一次上传把之前上传文件覆盖
//解决:方式1.在文件名称里面添加随机唯一的值
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + fileName;
//方式2 把文件按照日期进行分类
String datePath = new DateTime().toString("yyyy/MM/dd");
fileName = datePath +"/" + fileName;
//调用oss方法实现上传
//第一个参数:Bucket名称
//第二个参数:上传到oss文件路径和文件名称
//第三个参数:上传文件输入流
ossClient.putObject(bucketName,fileName,inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后的文件路径返回
String url = "https://" + bucketName + "."+endpoint + "/" + fileName;
return url;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
控制层
@RestController
@RequestMapping("/file/upload")
@AllArgsConstructor
public class FileController {
private final IFileService fileService;
@PostMapping
public String upload(MultipartFile file){
//获取上传文件 MultipartFile
//返回上传到oss的路径
String url = fileService.upload(file);
return url;
}
}
添加swagger依赖,测试文件上传功能
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
通过swagger进行验证
返回控制台,可查看到上传的文件
通过详情中的Url可正常访问到
至此,springboot整合阿里云OSS完成啦!