OSS对象存储
OSS对象存储是专门用来存储图片视频文件等。
这里用阿里云实例
依赖
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
以SpringBoot为例:
第一步:先在资源文件中写上OSS各个属性,写在资源文件好维护。
aliyun:
oss:
access-key-id: 你的access-key-id
access-key-secret: 你的access-key-secret
bucket-domain: 你的bucket-domain
bucket-name: 你的bucket-name
end-point: 你的 end-point
第二步:写OSS类,用来取资源文件里OSS的值。
需要把类交给Spring来进行管理
// 实现Spring中的InitializingBean可以使该bean在进行初始化的时候执行afterPropertiesSet()方法来对属性进行赋值。
@Component
public class OssResources implements InitializingBean {
// 利用Spring中的@Value来进行取值, '${}'是spring中的表达式,key是资源文件中的key
@Value("${aliyun.oss.end-point}")
private String endPoint;
@Value("${aliyun.oss.bucket-name}")
private String bucketName;
@Value("${aliyun.oss.access-key-id}")
private String accessKeyId;
@Value("${aliyun.oss.access-key-secret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucket-domain}")
private String bucketDomain;
// OSS各个属性值
public static String END_POINT;
public static String BUCKET_NAME;
public static String ACCESS_KEY_ID;
public static String ACCESS_Key_SECRET;
public static String BUCKET_DOMAIN;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT=endPoint;
BUCKET_NAME=bucketName;
ACCESS_KEY_ID=accessKeyId;
ACCESS_Key_SECRET=accessKeySecret;
BUCKET_DOMAIN=bucketDomain;
}
}
第三步:在Service层写上具体的逻辑代码
@Override
public String uploadTeacherAvatar(MultipartFile file) {
// 取值
String endpoint = OssResources.END_POINT;
String accessKeyId = OssResources.ACCESS_KEY_ID;
String accessKeySecret = OssResources.ACCESS_Key_SECRET;
String bucketName = OssResources.BUCKET_NAME;
// 创建OSS实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 获取上传文件输入流
InputStream inputStream = file.getInputStream();
// 获取文件名称
String fileName = file.getOriginalFilename();
// 在文件名称里面添加随机唯一的值,避免文件覆盖
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName=uuid+fileName;
// 把文件按照日期进行分类
// 获取当前日期,给日期格式化,可以使文件以2021/3/11分类
String dateTime = new DateTime().toString("yyyy/MM/dd");
// 拼接
fileName=dateTime+"/"+fileName;
// 调用oss方法实现上传
// 第一个参数 Bucket名称
// 第二个参数 上传到oss文件路径和文件名称 aa/bb/1.jpg
// 第三个参数 上传文件输入流
ossClient.putObject(bucketName,fileName,inputStream);
// 把上传后的路径返回存到数据库
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
return url;
}catch (Exception e){
e.printStackTrace();
}finally {
// 关闭OSSClient数据源
ossClient.shutdown();
}
return null;
}
第四步:在controller层获取文件,获取文件参数需要使用MultipartFile,并且文件大小不易过大。
自定义上传文件大小
spring:
servlet:
multipart:
max-file-size: 5MB # 单个文件上传的最大值
max-request-size: 10MB # 请求上传文件的最大值(相当于上传多个文件的最大值)