在工具类中,所有的属性和方法一般都是静态的,使用static修饰,但是从yml中获取属性时,不能用static修饰,所以使用如下方式解决。用常量类继承InitializingBean,把从yml中获取的非常量属性复制给static属性,并重写afterPropertiesSet方法即可优雅的解决。
#阿里云OSS
#不同的服务器,地址不同
aliyun:
oss:
file:
endpoint: oss-cn-shenzhen.aliyuncs.com
keyid: xxxxxxxxxx
keysecret: xxxxxxxx
#bucket可以在控制台创建,也可以使用java代码创建
bucketname: edu-guli
@Component
@ConfigurationProperties("aliyun.oss.file")
@Data
public class OSSConstantProperties implements InitializingBean {
/**
* 存储节点地址
*/
private String endpoint;
/**
* 秘钥id
*/
private String keyid;
/**
* 密匙
*/
private String keysecret;
/**
* 文件夹名称
*/
private String bucketname;
public static String END_POINT;
public static String KEY_ID;
public static String KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
KEY_ID = keyid;
KEY_SECRET = keysecret;
BUCKET_NAME = bucketname;
}
}
public interface IOssService {
/**
* 上传头像到阿里云OSS
* @param file 头像
* @return 头像url
*/
String uploadFileAvatar(MultipartFile file);
}
@Service
public class OssServiceImpl implements IOssService {
/**
* 上传头像到阿里云OSS
*
* @param file 头像
* @return 头像url
*/
@Override
public String uploadFileAvatar(MultipartFile file) {
String endPoint = OSSConstantProperties.END_POINT;
String keyId = OSSConstantProperties.KEY_ID;
String keySecret = OSSConstantProperties.KEY_SECRET;
String bucketName = OSSConstantProperties.BUCKET_NAME;
OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);
try {
//获取上传的文件输入流
InputStream inputStream = file.getInputStream();
//获取文件名称
String filename = file.getOriginalFilename();
//1.在文件名称里面添加唯一的值
String uuid = UUID.randomUUID().toString().replace("-", "");
//阿里云oss的文件名称
filename = uuid+filename;
//2 把文件按照日期进行分类
//获取当前日期
// 2020/5/12
String datePath = new DateTime().toString("yyyy/MM/dd");
//拼接
filename = datePath+"/"+filename;
//调用oss方法实现上传
//第一个参数 Bucket名称
//第二个参数 上传到oss文件路径和文件名称 aa/bb/1.jpg
//第三个参数 上传文件输入流
ossClient.putObject(bucketName,filename,inputStream);
//关闭OSSClient
ossClient.shutdown();
//上传之后拼接图片的路径
String url = new StringBuilder("https://").append(bucketName).append(".")
.append(endPoint).append("/").append(filename).toString();
return url;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}