开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):课程管理-添加小节上传视频(后端)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11405
课程管理-添加小节上传视频(后端)
内容介绍:
一、引入依赖
二、创建 application 配置文件
三、创建启动类
四、创建 controller service
(1)Controller
(2)Service
把前端和后端的服务整合起来 做一个分析,在后面操作的时候,需要把前端后端都启动。启动之后登陆添加课程中首先第一步,加课程的基本信息,随便添加,再加上分类,要不在课程大纲里可以添加一个章节123,添加小节。
增加课时标题第一节 Java 入门语法,里面课时排序1,里面有一个上传视频,所以在添加课时,添加小节的时候 可以实现一个视频上传的功能,可以将视频传入到阿里中去,不是存视频的地址,而是保存视频上传的 ID 上传之后会返回 ID,所以把ID 保存,根据可以得到凭证或者地址等相关信息。
先写接口,在整合前端,把前端写出来。首先 接口先完成,Service vod 中进行开发,把视频部分全部写入 vod 中。
一、引入依赖
版本已经知道,在 vod 的子模块中 把依赖直接引进来,然后在课件中直接复制。
有一个细节,他的版本不能乱写。版本有相关的对应关系,vod的版本不能乱对应,可以到官网上查询对应的版本,引入依赖,依赖中的位置不同的版本。
二、创建application配置文件
D的 resource 里面有一个application properties 文件,然后把文件中的配置复制过来,他的内容中第一个是服务端口号,vod 现在变成8003,下面有他的 ID 和密钥,复制 ID 和密钥进行使用。
下面创建代码,Java 里面建一个包,Com. atguigu.vod,完成之后先创建一个启动类,比如叫 vodapplication,启动类的上面添加一个注解 是springbootapplication,
里面有一个 DataSourceAutoConfiguration. class,因为在 vod 中只是做视频的操作,并没有操作数据库,数据库在 abo 中,所以没有引入数据库的位置,有可能会报错。
这个代码就是默认不去做数据库的操作,引入依赖 加完之后,包括自动填充 加上一个扫描规则,这是关于启动类的创建。
三、创建启动类
SpringBootApplication(exclude= DataSourceAut. class
eComponentScan(basePackages =("com. atguig)
public class VodApplication
public static void main(String[]args)
SpringApplication. run(VodApplication. class, args):
四、 创建 controller service
(1)Controller
@RestController
@RequestMapping("/eduvod/video") public class VodController{
}
首先建一个包创建 control,名字叫 vodcontrol,在上面加上一个注解,
二个是 request mapping 指定路径,路径指定的名字叫 eduvod/video,之后创建service,先来一个包,有一个 interface 这样的接口 叫 vod service,后写上实现类vod servic,在直接实现接口,别忘在 service 上面加上注解,最后在 control 里面把方法写一下,方法就是上传视频的方法,或者上传到阿里云的方法。
上传提交的方式都是 post 提交,写一个 post 名字,最后 return 一个值,不要报错,因为现在需要做上传视频,在添加小节的位置,需要传入本地视频。
在方法中做到的第一部分,需要获取上传的文件,Multiplefile 获得上传文件,过程都写到 service 中 加一个 private 等,通过 service 就可以把功能实现。
在里面把文件传过来,传视频之后会返回视频 ID,最后把 ID 需要加到数据表中。
∥上传视频到阿里云
EPostMapping ("uploadAlyivideo")
public R uploadAlyiVideo(MultipartFile file){
/返回上传视频id
String videold= vodService. uploadvideoAly(file):
return R. ok() data("videoId", videoId)
(2)Service
写完之后写 service ,先创建一个接口。
来到实现内容,实现出来,找到官方代码进行实现,之前用本地文件上传接口,用其他的也可以,网络流不合适,文件流也不合适,流式上传进行实现,这个代码把功能写出来,直接复制。
里面的注释去掉,保留最基本的结构,手动引入依赖,引入之后需要传入几个参数,按照之前写过的方式读配置文件,一个和第二个是 ID 和密钥,Inputstream 是上传文件 输入流,Filename 是上传文件原始名称,title 是上传里面显示的名称,流必须要有,现在是这几个重要的参数。
下面的结构一样,直接调用方法,通过 response 得到视频 ID。跟增加一个变量叫做video ID,在里面做一个赋值,不影响上传。
把 video ID 做一个 return 这样方法和结构都显示出来了,先写ID和密钥的参数,用之前的方式,用 Service 的注解读取配置文件,再写一个常量,向里面做一个赋值。
写一个包,叫做 utils,梦见一个工具类 叫做 constant VodUtils,之后实现接口Init,在类上面加上注解,县里面的方法,实现之后,通过注解读取刚才配置文件中的内容 ID 和密钥。
一个是 too string 第二个是密钥,在注解里面加上表达式,把名字复制过来,第二个名字密钥,之后加上常量,做赋值即可。
这样就把工具类完成了:
VodServicelmpl java ConstantPropertiesUtijava Constan
eValue("${aliyun. vod. file. keyid]")
private String keyid:
EValue ("{aliyun. vod. file. keysecret}")
private String keysecret:
public static String ACCESS KEY SECRET:
public static String ACCESS_KEY_ ID:
cOverride
public void afterPropertiesSet() throws Exception
ACCESS KEY ID keyid:
ACCESS KEY SECRET keysecret;
然后把值再用一下,第一个值取里面的 ID,第二个取密钥,之后把里面的值定义一下。
在 file 里面有他的实际名字,流的位置有异常,加上 catch,捕获 exception。
名称可以和 fire name 起一个名称,这名称可能叫做01.mp4,现在想直接取名称,不带后缀值,上01,不带 mp4。根据点的位置做一个截取,方法很简单,直接复制。
用 substring 做个截取,文件名字可以这么写,得到最后一个点的位置 得到01.03.09的值,title 就写这个,这是几个参数,最终上传接口完成,然后做一个测试。
现在接口完成,最后做一个最终的测试,看一下效果,加上注解,演示跨域,启动服务器测试。
//01.03.09.mp4
String fileName=filegetOriginalFilenameO;//title:上传之后显示名称
String title=fileName.substring(o,fileName.lastIndex0f(."))//inputStream:上传文件输入流
InputStream inputStream=file.getInputStream));
UploadStreamRequest request=new UploadStreamRequest
ConstantVodUtils.ACCESS KEYID,ConstantVodUtils. ACCESS KEY SECRET title,fileName, inputStream);
UploadVideoImpl uploader=new UploadVideoImpl())
UploadStreamResponseresponse =uploader.uploadStream(request)
String videoId=null;
if(responseisSuccess()){
videoId=response.getVideoId(;
else {
videoId =response. getVideoId();
return videoId;
}