阿里云oss对象存储实践
将oss参数写入配置文件
# 服务端口
server.port=8002
# 服务名
spring.application.name=service-oss
# 环境配置:dev、test、prod
spring.profiles.active=dev
# 阿里云oss,用于常量类读取
aliyun.oss.file.endpoint=oss-cn-hangzhou.aliyuncs.com
aliyun.oss.file.keyid=LTAI4GFWvpBwFzgAB93QnxZC
aliyun.oss.file.keysecret=4swIof0VAtGcHa93fFE9hKGvK6Wf9p
aliyun.oss.file.bucketname=czs-edu
创建工具类
// 当项目已启动,spring加载之后,执行接口一个方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {
// 读取配置文件中的内容
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
//定义公开静态常量
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
简单文件上传示例
// service层
public String uploadFileAvatar(MultipartFile file) {
String endpoint = ConstantPropertiesUtils.END_POINT;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 上传文件流。
InputStream inputStream = file.getInputStream();
// 获取文件名称
String filename = file.getOriginalFilename();
//第一个参数:Bucket名称
//第二个参数:上传到oss文件路径和文件名称 如 /aa/bb/1.jpg
//第三个参数:上传文件输入流
ossClient.putObject(bucketName, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
// 把文件上传到阿里云路径手动返回
// 需要把上传到阿里云oss路径手动拼接出来
String url = "https://" + bucketName + "." + endpoint + "/" + filename;
return url;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// controller层
@Autowired
private OssService ossService;
//上传文件的方法
@PostMapping
public R uploadOssFile(MultipartFile file) {
// 获取上传文件 MultipartFile
// 返回上传到oss的路径
String url = ossService.uploadFileAvatar(file);
return R.ok().data("url", url);
}
- MultipartFile:获取文件类
- 多次上传相同名称文件,最后一次上传把之前文件覆盖,因此需要将文件名添加随机唯一值,让每个文件名称不同
- 对文件进行分类’
- 根据日期进行分类
- 把文件按照日期进行分类
文件上传完善,文件名唯一、按日期分类
// 上传文件流。
InputStream inputStream = file.getInputStream();
// 获取文件名称
String filename = file.getOriginalFilename();
// 1. 在文件名称里面添加随机唯一值
//uuid:qwer-43u5 去掉中间-
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//qwer-43u5jpg
filename = uuid + filename;
// 2. 把文件按照日期进行分类
// 2020/2/2/02.jpg
// 获取当前日期 需要依赖joda-time
String datePath = new DateTime().toString("yyyy/MM/dd");
filename = datePath + "/" + filename;
ossClient.putObject(bucketName, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
// 把文件上传到阿里云路径手动返回
// 需要把上传到阿里云oss路径手动拼接出来
String url = "https://" + bucketName + "." + endpoint + "/" + filename;
return url;