目录
第三方服务-通用思路
SDK
准备工作
阿里云OSS-入门程序
.putObject
如何拿到文件对应的字节数组?
.readAllBytes()
集成阿里云OSS完成文件上传
引入阿里云OSS文件上传的工具类
上传文件接口开发
.getOriginalFilename()
程序优化
参数配置化
@Value
@ConfigurationProperties
阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
我们在前端进行文件上传时,依然正常请求我们的服务器端,我们会将上传上来的文件交给阿里云OSS来进行存储和管理,阿里云OSS会为每个文件分配一个访问的路径,我们通过这个路径就可以直接访问阿里云OSS的这个文件
第三方服务-通用思路
第一步操作就是需要去做一些准备工作,我们要使用第三方的云服务,我们就需要去注册对应的账号,注册完账号还需要进行实名认证,实名认证完了我们就可以登录到对应的后台系统了,那登录进去后哦我们还要根据需要进行充值,这些都是一些准备工作
第二步我们就要开始编写入门程序了,我们只要参照官方的SDK去编写入门程序就可以了
SDK
Software Development Kit的简写,就是软件开发工具包,这个SDK就包括我们进行软件开发时所需要的依赖,以及代码的事例,这些都可以叫做SDK,那我们就可以参照SDK提供的代码示例来编写入门程序
第三步操作就是将其集成到我们的项目中,在项目中集成使用
准备工作
我们要使用阿里云就得注册阿里云的账号,注册完账号还需要进行实名认证,实名认证之后我们就可以登录到阿里云的后台了,登录到后台之后我们可以根据自己的需要去充值,只要大家存储的文件不多,几十M,其实你充不充值都可以,那如果说你存储的文件比较多,我要存储个几百M,那你充值个一块钱就足够使用了,紧接着第三步我们就要开通对应的云服务了,我们所要使用的服务是对象存储服务OSS,所以我们这里需要开通对象存储服务,接下来第四步我们需要去创建对象存储服务的存储空间,叫bucket,这个存储空间是存储对象的容器,再次强调对象存储服务所指的对象其实就是这个文件,而我们将来存储的文件都是要隶属于这个Bucket,第五步就是获取并配置这个AccessKey秘钥,这个秘钥就是我们阿里云身份的凭证,最终我们在代码中如果你想去使用这个云服务,那你就必须要去配置对应的AccessKey
阿里云OSS-入门程序
在Maven项目中加入依赖项,此时我们需要引入依赖
如果使用的是Java 9及以上的版本,则需要添加以下JAXB相关依赖。
我们来演示一下如何进行文件上传
我们点击复制代码,将所有代码复制过来然后做一个改造就可以了
在Demo中定义了这样一个main方法,在main方法中,它来完成文件上传的入门程序
endpoint代表的是我们所使用的阿里云OSS所对应的bucket,它的域名是什么,我们要到刚刚后台创建的buket去看一下我们的域名是什么,
在概览下面有一个访问端口的Endpoint(地域节点),我们知己复制这个地址直接将域名给它替换掉
注意:前面的协议不要替换,只替换后面的域名,都是htps协议
接下来是bucket的名字,替换成自己的bucket名字
objectName代表的是我们在对象存储服务中存储的对象的名字,其实就是文件的名字,将来你将文件传到这个存储空间中,那这个文件名叫什么呢?这一块需要指定一下,那将来我们需要上传的是一张图片,那我们就可以指定为001.jpg
region代表的是地域,我们选择的地域是北京,默认是cn-hangzhou,那我们这里改成cn-beijing就可以了
.putObject
进行文件上传的方法
当然在这个Demo中,它上传的是一个Hello OSS的字符串,但是我们这里不需要上传字符串,我要上传的是一个文件
如何拿到文件对应的字节数组?
File file = new File("");
byte[] bytes = Files.readAllBytes(file.toPath());
“”里面存放文件
.readAllBytes()
用于从文件系统中读取文件的所有字节
第二步读取这个文件,将这个文件读取成了一个字节数组
这样我们就完成了文件上传的代码改造
点击运行,返回阿里云OSS即可发现有了文件
点击001.jpg,有文件的访问路径,阿里云OSS会为每个文件分配一个访问路径,我们通过这个路径就可以访问这张图片了
那如果有了这个路径,将来前端想要呈现这个图片,直接拿到这个路径,就可以通过image将这个图片渲染展示出来了
文件上传需要请求服务器端的程序,那就去请求我们文件上传的Controller,在Controller中需要接收上传上来的文件,接收上来之后我们需要将文件存储起来,我们需要将这个文件存到阿里云OSS中去,而阿里云OSS中我们是可以创建多个存储空间的,也就是多个bucket,所以我们在这一块需要指定我们这个文件要存储到哪个bucket中,当阿里云OSS将这些文件存储起来之后,它会为每个文件分配一个访问路径,所以此时我们需要将这个返回路径再返回给Controller,Controller最终要将图片的访问路径,也就是访问的URL,返回给前端,那前端拿到这个URL就可以基于这个URL来访问阿里云OSS里的这张图片了,最终在前端页面就会将这张图片展示出来
集成阿里云OSS完成文件上传
引入阿里云OSS文件上传的工具类
这个工具类实际上是由官方的实例代码改造而来的,在项目中,我们直接调用这个工具类就可以完成文件上传了
上传文件接口开发
我们需要定义一个uploadController,在uploadController中开发这个文件上传的接口
.getOriginalFilename()
拿到文件的原始名称
在APIfox中,文件上传选择Body——from-data——file
程序优化
在刚才我们制作的AliyunOSS操作的工具类中,我们直接将 endpoint、bucketName参数直接在java文件中写死了
而如果开发一个大型项目,所有用到的技术涉及到的这些个参数全部写死在java代码中,是非常不便于维护和管理的
我们通常将这些容易变动的参数信息定义在一份文件中,在SpringBoot中我们通常会将其定义在application,yml这份配置文件中,也就说将这些参数配置到这份配置文件中,然后在Java代码中如果要用到这些参数呢,我直接去读取配置文件当中的这块参数信息就可以了
参数配置化
指将依稀需要灵活变化的参数,配置在配置文件中,然后通过@Value注解来注入外部配置的属性
我们要想用到这些参数怎么办呢
@Value
在SpringBoot中有一个@Value注解,我们直接通过@Value注解来注入外部配置的这些属性
我直接声明一个成员变量,然后在成员变量上加上一个注解,叫@Value,然后通过@Value来注入对应的配置项就可以了,大括号里面要写的就是yml配置文件中的key,你要将每一个配置项的值注入这个属性成员变量,最终在程序运行时这几个成员变量就有值了,那以后我如果想更改这个参数,我就不用再去动这个java代码了,我只需要动这个yml配置文件就可以了
但是使用@Value注解注入配置文件的配置项,如果配置项多,注入繁琐,需要一项一项注入,此时不便于维护管理 和 复用
大家想其他类中,我也需要用到这些个配置项怎么办?你是不是需要通过@Value再挨个在注入一次? 所以不便于代码的复用
那如果说我们需要注入的配置项比较多,在Spring中其实又提供了另外一种注解来简化这块的配置
@ConfigurationProperties
通过@ConfigurationProperties,我们就可以实现批量注入,我们可以一次性将多个配置项的值直接封装到一个实体类AliyunOSSProperties中,那以后如果你想获取到这些个配置项,你直接获取这些实体类中的属性就可以了
如果说我们想将配置项直接封装到一个实体类中,实体类中的属性名,需要与配置项中的这个key保持一致,那有endpoint这个key,就需要有endpoint这个属性,配置项对应的值要封装到实体类对应的属性中去,而要想完成封装,就要为这些实体类提供get,set方法,然后还要将这个实体类交给IOC容器管理,所以在实体类上还加了一个注解叫@Component,
配置文件凭什么能将阿里云OSS里面这个key下面的endpoint这个子key赋值给这个成员变量呢?
所以此时我们还要在实体类上再加上一个注解叫@ConfigurationProperties,而在@ConfigurationProperties这个注解中有个属性叫prefix,这个属性代表的是前缀的意思,那就表示这个实体类要封装的是配置文件中哪一个前缀下面的配置信息,那我这里要封装的是aliyun.oss这个前缀下的信息,这样程序运行的时候,他就可以将配置文件中这多个配置项的值直接封装到这个实体类中
其实这个实体类也就是一个Bean对象,那在其他Bean对象中,我们要想获取这个属性的值,我们直接去注入这个Bean对象,然后去调用这个Bean对象的get,set方法就可以获取到对应的属性,在其他对象我也想获取到这个属性的值,我直接再次注入这个Bean对象就可以了,这样你可以发现,我一次操作以后在想使用,我直接注入这个Bean就可以获取到配置项的值了,便于我们程序的复用
注入外部配置文件中的配置项的两种方式?
- @Value:一个属性一个属性的注入
- @ConfigurationProperties:批量将多个属性注入到Bean对象中