用户认证需要上传证件图片,因此我们要做文件服务,为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案:阿里云OSS。
阿里云OSS SDK文档 : https://help.aliyun.com/document_detail/32016.html
准备工作
开通“对象存储OSS”服务
(1)申请阿里云账号
(2)实名认证
(3)开通“对象存储OSS”服务
(4)进入管理控制台
注册登录阿里云
(1)实名认证
(2)找到开通云服务
(3)创建Bucket(为Bucket起一个名字,其余选项默认即可)
(4)得到endpoint:创建Bucket后,在概览页面可以获取当前Bucket的endpoint值,这个值后面编程的时候会用到
使用RAM子用户
进入子用户管理页面(AccessKEy管理)
添加用户 ---开启OpenAPI调用访问---获取子用户Id和key(一定一定要复制下来AccessKeyId, AccessKeySecret)---设置用户权限---AliyunOSSFullAccess
开始:
项目中引入aliyun-sdk-oss依赖
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
配置文件
aliyun:
oss: #阿里云 OSS
endpoint: #地域节点(域名)
key-id: # AccessKey
key-secret:
bucket-name: #桶名称
创建一个配置类,用于读取配置文件
@Configuration //标记当前类是一个配置类
@ConfigurationProperties(prefix = "aliyun.oss") //扫描配置文件 prefix前缀
@Data
public class OssConstantProperties {
private String endpoint;
private String keyId;
private String keySecret;
private String bucketName;
}
项目使用oss上传文件
public Map<String, String> upload(MultipartFile file) {
// 拿到keyId
String keyId = oosConstantProperties.getKeyId();
// 拿到keySecret
String keySecret = oosConstantProperties.getKeySecret();
// 拿到地域节点
String endpoint = oosConstantProperties.getEndpoint();
// 拿到数据桶名称
String bucketName = oosConstantProperties.getBucketName();
try {
// 获取文件名
String filename = file.getOriginalFilename();
// 生成uuid
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String dateTime = new DateTime().toString("yyyyMMdd");
// 重新拼接文件名,避免文件重复产生冲突
String resultName = dateTime + "/" + uuid + filename.substring(filename.lastIndexOf("."));
// 获取媒体文件输入流
InputStream inputStream = file.getInputStream();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, keyId, keySecret);
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, resultName, inputStream);
// 设置此属性可以返回response,如果不设置,response为空
putObjectRequest.setProcess("true");
// 使用oss客户端,发送请求并获取结果
PutObjectResult result = ossClient.putObject(putObjectRequest);
// 判断响应码是否正常
if (result.getResponse().getStatusCode() != 200) {
throw new RuntimeException("上传出错");
}
// 使用客户端方法,获取临时访问url
// 设置签名url过期时间,将在一小时后过期 单位:ms
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。方便认证成功后浏览器可以直接展示
URL url = ossClient.generatePresignedUrl(bucketName, resultName, expiration);
System.out.println("url:" + url);
// 封装数据
Map<String, String> map = new HashMap<>();
map.put("previewUrl", url.toString());
map.put("url", resultName);
return map;
} catch (IOException e) {
throw new RuntimeException(e);
}
注意(坑):
如果想要根据响应码判断是否上传成功,必须设置
// 设置此属性可以返回response,如果不设置,response为空
putObjectRequest.setProcess("true");
否则 result.getResponse() 会为空,导致出现异常
swagger测试上传功能
登录控制台查看上传的文件