谷粒在线教育OSS
对象存储 OSS
用官方的话来说
对象存储 OSS
海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性。使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。
特点:安全 成本低 高可靠 文件存放不丢失
正是有这些特点 现在的企业的文件的存储用的就是这个 OSS存储
1.创建一个OSS
1.阿里云OSS的服务开通
首先阿里云官网
https://www.aliyun.com/
然后点击产品
找到存储 打开对象存储OSS
2. 阿里云OSS的仓库创建
点击管理控制台
点击Bucket 列表 创建Bucket
名字命名不能使用中文
存储类型 选择低频访问存储 (主要是因为项目是用于个人开发提升 所有没有什么用户量)
读写权限 选择公共读 这样就可以直接访问到文件
几个重要数据
2.OSS文件上传 java配置(spring boot)
1.配置pom.xml 依赖
<!-- OSS 依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
2.配置OSS需要的几个参数
参数
ednpoint 本项目需要外网访问所以使用的是外网的endpoint 节点
accessKeyId 点击右上角头像
打开AccessKey管理 显示 accessKeyId
第一次打开是没有的可以点击创建即可
accessKeySecret 就是上面id所对的密钥 点击查看select 即可查看
bucketName 为之前所创建仓库名称
3.代码编写
1.在application.properties 中放入oss需要的参数
提醒不要在参数前后加入空格*
2.编写一个常量类 用于管理封装这三个参数
需要加上@Component 注解把该类加入到bean 才会执行afterPropertiesSet() 方法
@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_POIND;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
//afterPropertiesSet方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。
// afterPropertiesSet 必须实现 InitializingBean接口。
// 实现 InitializingBean接口必须实现afterPropertiesSet方法。
System.out.println(keyId+"."+keySecret+"."+endpoint);
END_POIND = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
3.文件上传以及管理
采用文件流的方式上传
首先先创建一个 OSS 实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
获取文件输入流
inputStream = file.getInputStream();
这里使用日期分类进行文件管理 把文件按天进行管理
// 以日期进行分类
// 把日期格式转为 2021/4/3 这种形式
String datepath = new DateTime().toString(“yyyy/MM/dd”);
这里需要导入一个依赖
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${jodatime.version}</version>
</dependency>
这个是日期时间工具
处理文件重名的方案有很多
这里的方案是在文件名前面加上uuid随机数
String uuid = UUID.randomUUID().toString().replaceAll("-","");
最后进行上传
ossClient.putObject(bucket, filename, inputStream);
bucket 仓库地址 filename 文件名 文件输入流 inputStream
关闭OSS 实例
ossClient.shutdown();
@Override
public String uploadFileAvatar(MultipartFile file) {
//上传
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = ConstantPropertiesUtils.END_POIND;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucket = ConstantPropertiesUtils.BUCKET_NAME;
System.out.println(accessKeyId+"."+accessKeySecret+"."+endpoint);
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
// InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt");
// 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
InputStream inputStream = null;
String url = "";
try {
// 选择
inputStream = file.getInputStream();
// 以日期进行分类
String datepath = new DateTime().toString("yyyy/MM/dd");
// 文件名 前面加上随机数 可以让相同的文件不一样
String uuid = UUID.randomUUID().toString().replaceAll("-","");
String filename = datepath+"/"+uuid+file.getOriginalFilename(); //上传文件名
ossClient.putObject(bucket, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
url="https://"+bucket+"."+endpoint+"/"+filename;
} catch (IOException e) {
e.printStackTrace();
}
return url;
}