搭建华为云obs服务
- 开通obs服务
- 创建桶对象
注意:不用特地买资源包,学习使用的话按需付费即可【记得在自己的华为云账号充一点钱方便他自己扣费】
创建成功之后:
点击进去之后,就可以知道对我们的有用参数:
- bucketName
- endpoint
- Obs的访问秘钥【ak,sk】
找到个人中心的控制台部分
点击我的凭证 -> 访问密钥 -> 添加密钥,并把获取到的密钥下载下来【是一个表格格式,打开之后就可以获取到自己的Access Key Id和Secret Access Key这两个有用参数】
java实现文件上传
前面的部分做完之后算是搭建好了华为云obs服务
更多细节参考官方文档: SDK - java部分
接下来我们要做的是在java代码中如何实现文件上传
导入依赖
<!--导入华为云obs服务依赖-->
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>esdk-obs-java-bundle</artifactId>
<version>3.21.11</version>
</dependency>
搭建模块
创建对象存储文件上传的专门模块:ObsController, ObsService, ObsServiceImpl
实现逻辑
Controller层:
在obsController中写一个upload方法:
需要注意的点:
- post请求
- 接受参数必须是MultipartFile类型,注意此时的参数名是file,所以前端部分在传输文件的时候,需要给name属性是file且type=file,不然不能正确上传
- 返回的data属性中是一个imgUrl, 也就是我们上传到华为云返给我们的url
Serviceimpl服务实现层:
此处为了避免硬编码的风格,我使用的是:
- 定义一个obs.properties的配置文件
- 创建一个ObsProperties.java的配置类把obs.properties的内容批量注入到对应的属性中
服务层实现逻辑:
- 注意:如果我们是上传图片,文件等,最好是使用的是文件流的方式,官方文档给出的方法是new File(filename),但是我们不是上传的本地文件,我们是通过前端部分传回的文件且此时是file对象接受参数,使用文件流的方式更好
- 注意拼接url【对照之前直接使用华为云obs图形化界面上传文件时给出的url进行对应的拼接】
-
- url的拼接此时就是: https:// + 自己创建的桶对象名字 + 服务节点endpoint + 文件名
代码:
@Override
public String upload(MultipartFile file) {
// 填写一些必要的信息
String endPoint = obsProperties.getEndpoint();
String ak = obsProperties.getAccessKey();
String sk = obsProperties.getSecretKey();
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
try {
// 获取文件流
InputStream inputStream = file.getInputStream();
String originalFilename = file.getOriginalFilename();
// 根据年月日创建一个文件夹,方便管理图片信息
String fileName = new DateTime().toString("yyyy/MM/dd") + UUID.randomUUID().toString().replace("-", "") + originalFilename;
// 使用文件流的方式上传 -- 创建PutObject请求
obsClient.putObject(obsProperties.getBucketName(), fileName, inputStream);
// 返回图片地址进行保存
// https://xianzeng.obs.cn-north-4.myhuaweicloud.com/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220908100029.jpg
System.out.println("https://" + obsProperties.getBucketName() + "." + obsProperties.getEndpoint() + "/" + fileName);
return "https://" + obsProperties.getBucketName() + "." + obsProperties.getEndpoint() + "/" + fileName;
} catch (Exception e) {
e.printStackTrace();
return "";
} finally {
if(obsClient != null) {
try {
obsClient.close(); // 关闭资源
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试
返回值是url,前端可以根据url直接渲染