一.阿里云OSS简介
阿里云对象存储服务,简称 OSS,是一种面向海量数据规模的分布式存储服务,具有稳定、可靠、安全、低成本的特点,能够提供十一个九的数据可靠性。OSS提供与平台无关的RESTful API接口,您可以在互联网任何位置存储和访问。OSS的容量和处理能力弹性扩展,并提供多种存储类型供您选择,全面优化存储成本。
二.注册
打开阿里云网站https://www.aliyun.com/,点击产品,再上云必备中找到对象存储,
点击 立即开通
三.文件上传
1.通过oss控制台上传
首先建一个Bucket->右面点击创建Bucket,根据下面你的所需进行更改
标准存储:文件频繁访问到用它
归档存储:基本不访问,只做存储
同城冗余存储,备份作用但收费
这里我只是做简单的项目,低频访问存储就可以了,需要访问不能用归档存储
完成后创建即可
oss控制台
点击左侧你刚创建的bucket,可以在里面通过控制台进行手动上传文件
2.通过Java代码进行上传
在实际开发的时候开发人员一般没有权限来到后台控制台,进行上传,所以大部分是通过代码来上传,建立了普通用户和oss存储的桥梁。
(1),准备工作
在bucket控制台中会有Access Key点击进入
创建ID和SecssKey
再找到开发oss的开发文档
找到这个文档利用里面现有的代码来进行,快速开发!我们要做的是文件文件上传的功能,所以下面我们写逻辑代码
(2).后端逻辑代码
1.创建以下服务结构
2.引入相关依赖
<dependencies>
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
</dependencies>
3.配置文件中配置相应环境
下面aliyun.oss.file.的值是刚刚生成的ID,key,你的oss地址,和bucket名字
#基本固定模式
#服务端口
server.port=8002
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同 ==前面后面都不能加空格!!!!!!!!!!!!!!!!!1
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=LTAI5tKSbrjRuatoVSMNs9Fk
aliyun.oss.file.keysecret=yHTcqZgnWTFxoRGkIxcOxefZ1Zmc1H
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=edu-zt-001
4.创建启动类
加上@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)原因是:
当springboot启动的时候会自动配置数据源,但是配置文件中没有配置数据源就会以下错误
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. *exclude = DataSourceAutoConfiguration.class
加上后就是再启动的时候,将数据源的自启动移除。就不会报错了!!
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(basePackages = {"com.zt"})
public class OssApplication {
public static void main(String[] args) {
SpringApplication.run(OssApplication.class,args);
}
}
5.创建常量类,读取配置文件中的内容
配置文件中的aliyun.oss.file后面的字段需要用到,所以创建工具类方便拿取。
* 因为是private类型的不能直接去用,
* 当项目一启动,就会交给spring管理,下面就会取到值,spring有接口
*
*
*/
@Component//交给spring管理
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;
}
}
6.在controller中创建service
作用是拿到文件的在oss上的路径,方便写入到数据库中,图片的格式是不能写到数据库中,数据库中记录的是图片在oss中的地址。
@CrossOrigin
@RestController
@RequestMapping("/eduoss/file")
public class OssController {
@Autowired
private OssService ossservice;
//上传头像的方法
@PostMapping
public UnResult uploadOssFile(MultipartFile file){
//获取上传文件
//返回上传到oss的路径
String url = ossservice.uploadFileAvatar(file);
return UnResult.ok().data("url",url);
}
}
7.在service实现上传文件到oss中
其中的代码是前面找到官方文档中的代码,
里面应注意的是:
当有多个文件重名的时候,oss中会默认存储最后一个,前面都覆盖掉了,解决的方法有两个
代码中注释写的很清楚了!!
1.用UUID生成唯一值,拼接到文件名中
2.根据日期来创建文件夹
//Service中
public interface OssService {
//上传头像到oss
String uploadFileAvatar(MultipartFile file);
}
//serviceimpl中
@Service
public class OssServiceImpl implements OssService {
@Override
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;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//获取文件上传输入流
InputStream inputStream = file.getInputStream();
//获取文件名称
String fileName = file.getOriginalFilename();
///当文件名重复的时候,再oss中会覆盖掉原有的文件
//解决1:用uuid---------------replace是为了将随机生成的数字的“-”去掉
String uuid= UUID.randomUUID().toString().replace("-","");
// //拼接
// fileName=uuid+fileName;
//解决2:把文件按日期分类
//2021//11/12/01.jpg
//获取当前日期,用依赖中的工具类
String datePath = new DateTime().toString("yyyy/MM/dd");
//拼接
fileName=datePath+fileName;
//调用oss方法实现上传
//参数1:Bucket名称
//参数2:上传到oss的文件路径和文件名
//参数3:上传文件输入流
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后的文件路径返回
//需要把上传到阿里云oss路径手动拼接出来
//根据路径名‘
String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
return url;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
8.测试
因为之前这个系统集成了swagger,所以用它来进行测试
命名方式为时间文件夹及UUID