阿里云OSS对象存储-图文详解
认识OSS
在实际的项目中,经常要用到上传图片的地方,阿里云的OSS对象存储,可以很好的将我们上传的图片存储到阿里云服务中,数据库只要存储图片的访问地址即可。
下面我们主要来编写后台服务的OSS功能。前端的调用相关后续在讲。
一、创建Bucket
这里注册阿里云账号和已经开通OSS对象存储,这里就不再说了,网上有很多的文案。
1. 进入OSS的控制台,在Bucket 管理列表中,可以查看到自己的Bucket 数量,如果已经有了,则不要创建。没有的话,跟着我下面来创建一个Bucket 。
2. 点击创建Bucket ,进入到Bucket基本信息填写表单中。
3.基本信息填写
- 【Bucket名称】 可以随意取,最好跟自己的项目名称有关系的名称,避免后面创建的Bucket多了分不清楚。
- 【地域】可以任意选择,可以根据自己所在区域进行选择。
- 【Endpoint】默认不可修改的,这个后面编写接口的时候要用到。
- 【所属资源组】可以不选择。
- 【存储类型】自己学习用的话,选择“低频访问选择”就可以,如果是企业项目的话,最好选择标准存储。后面的归档类型,主要是存放后就基本不访问的情况。我们这里选择“低频访问选择”。
- 【HDFS服务】/【同城冗余存储】/【版本控制】这些都可以不用开启。
- 【读写权限】选择“公共读”就可以,写的时候,后端接口会进行身份认证校验的。
- 【服务端加密方式】/【实时日志查询】都可以不开通。
创建成功后,就会显示在Bucket 列表中。
二、后台服务接口编写
官网帮助文档:help.aliyun.com/document_de…
1.安装SDK: 官网提供了三种SKD的安装方式,这里我们使用maven的方式安装。
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
2.创建Access Key:在OSS存储对象首页概览中,最右侧中的常用入口有Access Key的入口。如果没有找到,或者在个人中心出的Access Key,也可以进入到Access Key设置页面。
进入会有提示窗口,选择继续即可。
进入到Access Key列表页面,如果创建过Access Key,可以直接使用,无需创建。如果没有,点击创建,进行验证码创建即可。
创建成功后,就会有==AccessKey ID==和==AccessKeySecret==,后面后用到。
3.OSS访问常量定义: 在进行文件上传的时候,需要身份的校验,因此我们需要把身份验证的相关信息,定义在配置文件中(yml/properties)。 这里主要用到的几个信息是:endpoint、accessKeyId、accessKeySecret、bucketName。
#配置阿里云oss
aliyun.oss.file.endpoint=你的自己’‘endpoint’‘
aliyun.oss.file.keyid=你自己的’‘accessKeyId’‘
aliyun.oss.file.keysecret=你自己的’‘accessKeySecret’‘
aliyun.oss.file.bucketname=你自己的’‘bucketName’‘
如果找不到【endpoint】信息的同学,可以进入你自己【Bucket 列表】,点击Bucket 名称进入到Bucket 的详情页面。选择【概览】,进入页面,下面就会有。选择外网访问中的Endpoint
4.上传逻辑代码:
- 使用Value()注解,注入在配置文件中配的常量参数。
- 在filename文件中,拼接了文件目录字符串,文件目录以每日的格式进行存储。(可选,如果不设置目录的话,所有的图片对象都全部存储在根目录)
- 最后拼接图片访问的url,返回给前端,前端统一封装成实体类,提交给新增/跟新的接口。
@Service
public class OssServiceImpl implements OssService {
@Value("${aliyun.oss.file.endpoint}")
String endpoint;
@Value("${aliyun.oss.file.keyid}")
String accessKeyId;
@Value("${aliyun.oss.file.keysecret}")
String accessKeySecret;
@Value("${aliyun.oss.file.bucketname}")
String bucketName;
@Override
public String uploadFile(MultipartFile file) {
String dir = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//获取文件名
String filename = dir + "/" + file.getOriginalFilename();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
//获取文件流
InputStream inputStream = file.getInputStream();
// 创建PutObject请求。
ossClient.putObject(bucketName, filename, inputStream);
//返回拼接后oss访问路径
String url = "https://" + bucketName + "." + endpoint + "/" + filename;
return url;
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
return null ;
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
三、接口测试
我这里集成了swagger,直接在swagger-ui中进行测试。
- 重启服务成功。
- 进入swagger-ui,上传图片后,提交。
- 接口返回成功。
- 进入OSS对象存储服务中,也现在了上传的图片。
后面我们只要访问这个URL就可以了。数据库只要存储这个地址。
转载自:https://juejin.cn/post/7169503052628983839