Appearance
本章讲解阿里云OSS是如何引入到SpringBoot项目中去的,从依赖到配置再到工具类的编写,保证能直接到真实上线的项目中去,
项目依赖
xml
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.0</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖。添加jaxb相关依赖示例代码如下:
xml
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
除此之外项目还用到了Hutool工具包用来生成日期,用于设置文件存放位置
xml
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>
配置文件
我们在application.yml配置文件中输入如下信息
yaml
xk857:
aliyun:
endpoint: https://oss-cn-shanghai.aliyuncs.com # oss端点
accessKeyId: AAAAI5t7Fy*****SADtASDj
accessKeySecret: JCASAI32y******pNa4cmmSSAocy
bucketName: student-xk857 #bucket名称
bucketDomain: https://oss.xk857.com/ #Bucket 域名
读取配置文件
java
@Data
@Component
@ConfigurationProperties(prefix = "xk857.aliyun")
public class AliyunProperties {
/**
* 阿里云地域节点
*/
private String endpoint;
/**
* accessKeyId
*/
private String accessKeyId;
/**
* accessKeySecret
*/
private String accessKeySecret;
/**
* 存储空间名称
*/
private String bucketName;
/**
* Bucket域名,访问文件时作为URL前缀
*/
private String bucketDomain;
}
将OSSClient实例注入到Bean中
OSSClient是用于发送请求到阿里云的,如果每次上传文件都重新创建,那么会影响系统的性能,高并发下容易导致系统崩溃
java
@Component
public class AliBaseBean {
@Autowired
private AliyunProperties aliyunProperties;
@Bean
public OSS getOssClient(){
OSS oss = new OSSClientBuilder().build(aliyunProperties.getEndpoint(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
return oss;
}
}
阿里云OSS工具类
工具类包含上传文件和删除文件,使用@Component
让Spring扫描到此工具类,方法中获取阿里云OSS客户端实例和配置信息,完成文件上传与删除逻辑。
java
@Slf4j
@Component
public class AliOssUtils {
@Autowired
private AliBaseBean aliBaseBean;
@Autowired
private AliyunProperties aliyunProperties;
/**
* 文件上传文件
* @param file MultipartFile文件对象
* @return 文件地址
*/
public String uploadFileToOss(MultipartFile file) {
// 上传文件所在目录名,当天上传的文件放到当天日期的目录下。
String folderName = "simple_efficient/" + DateUtil.format(new Date(), "yyyyMMdd");
// 保存到 OSS 中的文件名,采用 UUID 命名。
String fileName = UUID.randomUUID().toString().replace("-", "");
// 从原始文件名中,获取文件扩展名
String fileExtensionName = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
// 文件在 OSS 中存储的完整路径
String filePath = folderName + "/" + fileName + fileExtensionName;
// 获取存储再Bean中的Client实例对象,防止重复创建
OSS ossClient = aliBaseBean.getOssClient();
// 上传文件到OSS 并响应结果
PutObjectResult putObjectResult = null;
try {
putObjectResult = ossClient.putObject(aliyunProperties.getBucketName(), filePath, file.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
ResponseMessage response = putObjectResult.getResponse();
if (response == null) {
// 上传成功 返回上传文件的访问完整路径
return aliyunProperties.getBucketDomain() + filePath;
} else {
// 上传失败,OOS服务端会响应状态码和错误信息
String errorMsg = "响应的错误状态码是【" + response.getStatusCode() + "】," + "错误信息【" + response.getErrorResponseAsString() + "】";
log.info("【上传图片出错】" + errorMsg);
// TODO 实际项目中应该抛出异常,为了防止新人观看看不懂如何使用的,这里直接返回字符串了
return errorMsg;
}
}
/**
* 根据文件url删除
* @param fileUrl 文件地址
*/
public boolean deleteFile(String fileUrl) {
// 去除文件 url 中的 Bucket域名
String filePath = fileUrl.replace(aliyunProperties.getBucketDomain(), "");
OSS ossClient = aliBaseBean.getOssClient();
try {
// 删除
ossClient.deleteObject(aliyunProperties.getBucketName(), filePath);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}