day9 课程信息确认与视频点播

  • 1.课程信息确认
    • 1.1 后端实现
    • 1.2 前端实现
  • 2.课程的最终发布
  • 3.课程列表功能
  • 4.课程删除功能
  • 5.阿里云视频点播
    • 5.1 获取视频地址
    • 5.2 获取视频凭证
    • 5.3 上传视频
  • 6.添加小节的视频上传功能
    • 6.1 后端实现
    • 6.2 前端实现
    • 6.3 nigix配置

1.课程信息确认
1.1 后端实现

到目前为止,我们已经完成了上图的第1,2步,现在开始做第三步的功能:课程最终发布。要实现课程的最终发布,我们需要让用户确认添加的各个信息,因此我们需要先把这些信息查询到。要查询的数据包括:课程名称、课程价格、课程简介…这显然涉及到多张表。

设计到查询多张表的内容,我们一般有两种思路:

  • 封装PO类(适用表的数量较少的情况,之前就是这么处理的)
  • 编写复杂sql、

显然,咱们涉及的表的数量较多,编写sql语句进行多表查询。首先课程表的数据我们全部需要,另外如果有其它课程信息也需要查询,可以使用左外连接进行。

sql语句如下,注意where子句中的ec.id替换成自己的数据库中存在的id。

SELECT ec.id,ec.title,ec.price,ec.lesson_num,ecd.description,et.name,es1.title AS oneSubject,es2.title AS twoSubject
FROM edu_course ec
LEFT JOIN edu_course_description ecd ON ec.id=ecd.id
LEFT JOIN edu_teacher et ON ec.teacher_id=et.id
LEFT JOIN edu_subject es1 ON ec.subject_parent_id=es1.id
LEFT JOIN edu_subject es2 ON ec.subject_id=es2.id
WHERE ec.id='1'

接下来我们在com.wangzhou.eduservice.entity.vo下定义CoursePublishVO

@Data
public class CoursePublishVo implements Serializable {private static final long serialVersionUID = 1L;private String id;//课程idprivate String title; //课程名称private String cover; //封面private Integer lessonNum;//课时数private String subjectLevelOne;//一级分类private String subjectLevelTwo;//二级分类private String teacherName;//讲师名称private String price;//价格 ,只用于显示}

com.wangzhou.eduservice.mapper。

public interface EduCourseMapper extends BaseMapper<EduCourse> {public CoursePublishVO getPublishCourseInfo(String courseId);
}

com.wangzhou.eduservice.mapper.xml.EduCourseMapper.xml。请读者特别注意sql语句的变量命名要与PO类中的变量名保持一致。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangzhou.eduservice.mapper.EduCourseMapper"><select id="getPublishCourseInfo" resultType="com.wangzhou.eduservice.entity.vo.CoursePublishVO">SELECT ec.id,ec.title,ec.price,ec.lesson_num,ec.cover,ecd.description,et.name AS teacher_name,es1.title AS subject_level_one,es2.title AS subject_level_twoFROM edu_course ecLEFT JOIN edu_course_description ecd ON ec.id=ecd.idLEFT JOIN edu_teacher et ON ec.teacher_id=et.idLEFT JOIN edu_subject es1 ON ec.subject_parent_id=es1.idLEFT JOIN edu_subject es2 ON ec.subject_id=es2.idWHERE ec.id=#{id}</select>
</mapper>

现在mapper已经完成了,我们来实现调用吧。

com.wangzhou.eduservice.controller.EduCourseController.

//根据课程id查询课程确认信息
@GetMapping("/getpublishCourseInfo/{id}")
public R getpublishCourseInfo(@PathVariable String id){CoursePublishVO publishCourseInfo = eduCourseService.getPublishCourseInfo(id);return R.ok().data("publishCourse",publishCourseInfo);
}

EduCourseServiceImpl

  @Overridepublic CoursePublishVO getPublishCourseInfo(String id) {return baseMapper.getPublishCourseInfo(id);}

至此,就完成了后端的接口部分,读者可以使用swagger自测。

出了点问题。

看起来是因为找不到mapper文件。

这是由于maven的默认加载机制,只会把src/main/java下的java文件加载,该目录下其它文件不会加载。而我们的xml文件放在下图位置,显然是不会被加载的。

看看文件的输出目录。果然没有加载这些xml文件。

解决方法有三种:

(1)直接手动复制

(2)通过更改配置文件方式使maven加载

可以更改pom.xml和application.properties,为了使service下的子模块都能够生效,我们更改service下的pom文件。

 <build><resources><resource><directory>/src/main/java</directory><includes><!-- **表示多层目录 --><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources>
</build>

注:加在depencies后面。

注:classpath就是指src下的路径,或者说是tagret下的classes路径(参考下图),注意改成自己的路径。

重启项目,测试通过。(注:如果文件没有被复制过去手动拷贝吧)

1.2 前端实现

现在后端部分已经完成了,接下来要实现前端部分,首先我们要从课程信息的页面跳转到信息确认的页面,这个功能之前在

chapter.vue的next()方法中已经实现了。

在publish.vue页面需要做两件事情:从路由中得到courseId,调用接口显示数据。

(1)先实现前端的接口course.vue。

 // 根据id查询课程确认信息getpublishCourseInfo(id){return request({url:`/eduservice/edu-course/getpublishCourseInfo/${id}`,method: 'get',})}

(2)从路由中拿到courseId

publish.vue

 created() {if(this.$route.params && this.$route.params.id) {this.courseid = this.$route.params.id}}

(3)调接口

import publishCourse from "@/api/edu/course.js";

  getpublishCourseInfo(){publishCourse.getpublishCourseInfo(this.courseid).then(resp => {this.publishCourse = resp.data.publishCourse})}

(4)显示数据

(5)样式

加亿点点样式。

<template><div class="app-container"><h2 style="text-align: center">发布新课程</h2><el-steps:active="3"process-status="wait"align-centerstyle="margin-
bottom: 40px;"><el-step title="填写课程基本信息" /><el-step title="创建课程大纲" /><el-step title="最终发布" /></el-steps><div class="ccInfo"><img :src="publishCourse.cover" /><div class="main"><h2>{{ publishCourse.title }}</h2><p class="gray"><span>共{{ publishCourse.lessonNum }}课时</span></p><p><span>所属分类:{{ publishCourse.subjectLevelOne }} —{{ publishCourse.subjectLevelTwo }}</span></p><p>课程讲师:{{ publishCourse.teacherName }}</p><h3 class="red">¥{{ publishCourse.price }}</h3></div></div><el-form label-width="120px"><el-form-item><el-button @click="previous">返回修改</el-button><el-button :disabled="saveBtnDisabled" type="primary" @click="publish">发布课程</el-button></el-form-item></el-form></div>
</template>
<style scoped>
.ccInfo {background: #f5f5f5;padding: 20px;overflow: hidden;border: 1px dashed #ddd;margin-bottom: 40px;position: relative;
}
.ccInfo img {background: #d6d6d6;width: 500px;height: 278px;display: block;float: left;border: none;
}
.ccInfo .main {margin-left: 520px;
}
.ccInfo .main h2 {font-size: 28px;margin-bottom: 30px;line-height: 1;font-weight: normal;
}
.ccInfo .main p {margin-bottom: 10px;word-wrap: break-word;line-height: 24px;max-height: 48px;overflow: hidden;
}
.ccInfo .main p {margin-bottom: 10px;word-wrap: break-word;line-height: 24px;max-height: 48px;overflow: hidden;
}
.ccInfo .main h3 {left: 540px;bottom: 20px;line-height: 1;font-size: 28px;color: #d32f24;font-weight: normal;position: absolute;
}
</style>

课程确认信息的显示就实现了。测试如下。

2.课程的最终发布

现在课程虽然已经添加到了数据库了,但是课程还没有真正的发布:只有在课程发布以后用户才可以看到课程。在数据库中有一个字段status,发布的课程会将其置成Normal

因此,所谓的课程发布其实是修改操作,我们可以直接调用之前的updateCourseInfo()接口,不过为了使功能更加清晰,我们重新在

EduCourseController中实现publishCourse方法。

     // 发布课程// 修改课程状态@PostMapping("/publishCourseInfo/{courseId}")public R publishCourseInfo(@PathVariable String courseId) {EduCourse course = new EduCourse();course.setId(courseId);course.setStatus("Normal");eduCourseService.updateById(course);return R.ok();}

course.js

  //发布课程publishCourseInfo(courseId){return request({url:`/eduservice/edu-course/publishCourseInfo/${courseId}`,method: 'post'})}

publish.vue。

 publish(){publishCourse.publishCourseInfo(this.courseid).then(resp => {// 提示课程发布成功//提示信息this.$message({type: "success",message: "发布成功!",});// 页面跳转this.$router.push({ path: "/course/list" });})}
3.课程列表功能

需求如下图。与之前的讲师列表内容基本是一致的。

先来实现最简单的部分:数据的展示。EduCourseController类。

   // 课程列表// Todo 完善成条件查询带分页功能@GetMapping("/getCourseList")public R getCourseList() {List<EduCourse> courseList = eduCourseService.list(null);return R.ok().data("list", courseList);}

前端接口部分。course.js.

 // 课程列表// Todo getCourseList() {return request({url:"/eduservice/edu-course/getCourseList",method: 'get'})}

咱们拿着讲师列表过来快速改下。

<template><div><!--多条件查询表单--><el-form:inline="true"class="demo-form-inline"style="margin-left: 20px; margin-top: 12px;"><el-form-item label="课程标题"><el-inputv-model="courseQuery.title"placeholder="请输入标题"></el-input></el-form-item><el-form-item label="课程状态"><el-select v-model="courseQuery.status" placeholder="课程状态"><el-option label="已发布" :value='Normal'></el-option><el-option label="未发布" :value='Draft'></el-option></el-select></el-form-item><el-form-item><el-button type="primary" icon="el-icon-search" @click="getList()">查询</el-button><el-button type="default" @click="resetData()">清空</el-button></el-form-item></el-form><el-table:data="list"style="width: 100%"borderfithighlight-current-rowelement-loading-text="数据加载中"v-loading="listLoading"><el-table-column prop="number" label="序号" width="120" align="center"><template slot-scope="scope">{{ (page - 1) * limit + scope.$index + 1 }}</template></el-table-column><el-table-column prop="title" label="课程名称" width="280"> </el-table-column><el-table-column label="状态" width="80"><template slot-scope="scope">{{ scope.row.status === 'Normal' ? "已发布" : "未发布" }}</template></el-table-column><el-table-column prop="price" label="价格" width="120" /><el-table-column prop="gmtCreate" label="添加时间" width="160" /><el-table-column prop="lessonNum" label="课时数" width="120" /><el-table-column label="操作" width="200" align="center"><template slot-scope="scope"><router-link :to="'/course/edit/' + scope.row.id"><el-button type="primary" size="mini" icon="el-icon-edit">章节编辑</el-button><el-button type="primary" size="mini" icon="el-icon-edit">小节编辑</el-button></router-link><el-buttontype="danger"size="mini"icon="el-icon-delete"@click="removeDataById(scope.row.id)">删除</el-button></template></el-table-column></el-table><!--分页组件--><el-paginationbackgroundlayout="prev, pager, next,total,jumper":total="total":page-size="limit"style="padding: 30px 0; text-align: center":current-page="page"@current-change="getList"></el-pagination></div>
</template><script>
// 调用course.js
import course from '@/api/edu/course'
export default {data() { // 定义变量及初始化数据return {page:1, //当前页limit:10,list:null, // 查询返回的记录集courseQuery:{}, // 查询的条件total:0 //总记录数}},created() {this.getList()},methods: {// 条件查询带分页 getList() {course.getCourseList().then(response => {this.list =  response.data.list}).catch(error => {console.log(error)})},// 清空搜索条件resetData() {// 清空搜索框this.teacherQuery = {}// 显示全部表单数据this.getList()}}
}
</script>

看起来凑合着能看。这里暂时实现到这个程度,后续有时间进一步来完善。

4.课程删除功能

需求如下。

EduCourseController。

 @DeleteMapping("deleteCourse/{courseId}")public R deleteCourse(@PathVariable String courseId) {Boolean delete = eduCourseService.removeCourse(courseId);if(delete) {return R.ok();} else {return R.error();}}

EduCourseService.

      @AutowiredEduCourseDescriptionService eduCourseDescriptionService;@AutowiredEduChapterService eduChapterService;@AutowiredEduVideoService eduVideoService;@Overridepublic Boolean removeCourse(String courseId) {// 1.删除课程小节eduVideoService.deleteVideo(courseId);// 2.删除课程章节eduChapterService.deleteChapter(courseId);// 3.删除课程描述eduCourseDescriptionService.deleteDescription(courseId);// 4.删除课程return baseMapper.deleteById(courseId) > 0;}

EduVideoServiceImpl

@Override
public void deleteVideo(String courseId) {QueryWrapper<EduVideo> wrapper = new QueryWrapper<>();wrapper.eq("course_id", courseId);baseMapper.delete(wrapper);
}

EduCourseDescriptionServiceImpl

    @Overridepublic void deleteDescription(String courseId) {baseMapper.deleteById(courseId);}

deleteChapter之前实现过了,此处不赘述。前端部分请读者自行实现。后端部分使用swagger测试,如下。检验数据库,功能实现。

5.阿里云视频点播

阿里云官网开通视频点播(推荐按照流量计费,不用不花钱)。

阿里云视频点播服务提供API与SDK。API就是提供一些视频操作(上传、下载…)的固定url,我们通过提供的url拼接参数进行操作。SDK对API方式进行了封装,我们直接调用SDK中的类与方法来实现功能,使用更加方便,官方推荐使用。

在阿里云官网有具体的入门教程https://help.aliyun.com/document_detail/57756.htm。下面写一些简单demo入门。

在demo前,先提示一个细节:因为视频有加密的方式,加密视频不可以通过地址直接访问,因此我们在数据库中不存储视频的地址,而存储视频的Id。通过Id可以拿到视频的播放地址、凭证等信息。

5.1 获取视频地址

(1)引入依赖

service下新建Maven子模块service_vod。在其中pom.xml中引入依赖。

 <!--   视频点播对maven仓库的配置和依赖     -->
<repositories><repository><id>sonatype-nexus-staging</id><name>Sonatype Nexus Staging</name><url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>    <!--   jar包依赖     -->
<dependencies><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-vod</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency>
</dependencies>

(2)初始化操作

由于我们现在是demo,在test目录下新建com.wangzhou.vodtest包。InitObject类中创建DefaultAcsClient对象

package com.wangzhou.vodtest;import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;//初始化类
public class InitObject {public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {String regionId = "cn-shanghai";  // 点播服务接入区域DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);DefaultAcsClient client = new DefaultAcsClient(profile);return client;}}

测试类。

public class TestVod {public static void main(String[] args) throws ClientException {// 1.创建客户端DefaultAcsClient client = InitObject.initVodClient("xxxx", "xxxx");// 2.创建request、responseGetPlayInfoRequest request = new GetPlayInfoRequest();GetPlayInfoResponse response = new GetPlayInfoResponse();// 3.设置视频Id值request.setVideoId("xxxx");// 4.获取responseresponse = client.getAcsResponse(request);List<GetPlayInfoResponse.PlayInfo> playInfoList = response.getPlayInfoList();//播放地址for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) {System.out.print("PlayInfo.PlayURL = " + playInfo.getPlayURL() + "\n");}//Base信息System.out.print("VideoBase.Title = " + response.getVideoBase().getTitle() + "\n");//VideoBase.Title = 6 - What If I Want to Move Faster.mp4}}

读者可以自测。

5.2 获取视频凭证

对于加密视频,地址无法直接播放视频。我们需要得到视频的凭证。

private static void getVideoAuth() throws ClientException {// 1.创建客户端DefaultAcsClient client = InitObject.initVodClient("LTAI5tFgGXoyhNYWPMHf3gNz", "C8acTTWjFrySJIarGvSfJVTQNce1vt");// 2.创建request、responseGetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();GetVideoPlayAuthResponse response = new GetVideoPlayAuthResponse();// 3.设置视频Id值request.setVideoId("77b9dd1391c54adf88d7b30efb5486f6");// 4.获取responseresponse = client.getAcsResponse(request);//Base信息System.out.print("Video Auth = " + response.getPlayAuth() + "\n");//VideoBase.Title = 6 - What If I Want to Move Faster.mp4}
5.3 上传视频

(1)引入依赖

下面为官方教程中列出的依赖,在pom文件中添加,之前添加过的可以不要再添加。

<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.1</version>
</dependency>
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-vod</artifactId><version>2.15.11</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version>
</dependency>
<dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20170516</version>
</dependency>
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.2</version>
</dependency>

aliyun-java-vod-upload-1.4.14.jar未开源(其它jar包不需要),参考官网文档下载配置。

参考官方代码进行测试。

  /*** 本地文件上传接口** @param accessKeyId* @param accessKeySecret* @param title 上传后视频名* @param fileName 上传的文件路径*/private static void testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) {UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName);/* 可指定分片上传时每个分片的大小,默认为2M字节 */request.setPartSize(2 * 1024 * 1024L);/* 可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/request.setTaskNum(1);UploadVideoImpl uploader = new UploadVideoImpl();UploadVideoResponse response = uploader.uploadVideo(request);System.out.print("RequestId=" + response.getRequestId() + "\n");  //请求视频点播服务的请求IDif (response.isSuccess()) {System.out.print("VideoId=" + response.getVideoId() + "\n");} else {/* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */System.out.print("VideoId=" + response.getVideoId() + "\n");System.out.print("ErrorCode=" + response.getCode() + "\n");System.out.print("ErrorMessage=" + response.getMessage() + "\n");}}
6.添加小节的视频上传功能
6.1 后端实现

(1)引入依赖

已完成.

(2)配置appliaction.properties

# 服务端口号
server.port=8003# 服务名
spring.application.name=service_vod# 环境设置 dev test prod
spring.profiles.active=dev# 最大上传单个文件大小:默认1M
spring.servlet.multipart.max-file-size=1024MB
# 最大置总上传的数据大小 :默认10M
spring.servlet.multipart.max-request-size=1024MB# 阿里云 vod
aliyun.vod.file.keyid=xxx
aliyun.vod.file.keysecret=xxx

上面vod部分请读者自己配置。

(3)创建启动类

package com.wangzhou.vod;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;// 该模块与数据库无交互,加入exclude参数避免报错
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
// 配置包扫描规则,这样我们就能用到swager-ui等在com.wangzhou中存放的功能
@ComponentScan(basePackages = "com.wangzhou")
public class VodApplication {public static void main(String[] args) {SpringApplication.run(VodApplication.class ,args);}
}

(4)Controller

@EnableSwagger2
@RestController
@CrossOrigin
@RequestMapping("eduvod/video")
public class VodController {@Autowiredprivate VodService vodService;@PostMapping("/uploadVideo")public R uploadVideo(MultipartFile file) {String videoId = vodService.uploadFile(file);return R.ok().data("videoId", videoId);}
}

(5)service

public interface VodService {String uploadFile(MultipartFile file);}
@Service
public class VodServiceImpl implements VodService {/*** 文件流上传接口**/@Overridepublic String uploadFile(MultipartFile file) {try {String videoId;String accessKeyId = ConstantVodUtils.ACCESSKEY_ID;String accessKeySecret = ConstantVodUtils.ACCESSKEY_SECRET;String fileName = file.getOriginalFilename();String title = fileName.substring(0, fileName.lastIndexOf("."));UploadStreamRequest request = new UploadStreamRequest(accessKeyId, accessKeySecret, title, fileName,file.getInputStream());UploadVideoImpl uploader = new UploadVideoImpl();UploadStreamResponse response = uploader.uploadStream(request);/* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */videoId = response.getVideoId();return videoId;} catch (Exception e) {e.printStackTrace();return null;}}
}

(6)application.properties

# 服务端口号
server.port=8003# 服务名
spring.application.name=service_vod# 环境设置 dev test prod
spring.profiles.active=dev# 最大上传单个文件大小:默认1M
spring.servlet.multipart.max-file-size=1024MB
# 最大置总上传的数据大小 :默认10M
spring.servlet.multipart.max-request-size=1024MB# 阿里云 vod
aliyun.vod.file.keyid=LTAI5tFgGXoyhNYWPMHf3gNz
aliyun.vod.file.keysecret=C8acTTWjFrySJIarGvSfJVTQNce1vt

(7)ConstantVodUtils

@Component
public class ConstantVodUtils implements InitializingBean {@Value("${aliyun.vod.file.keyid}")private String keyId ;@Value("${aliyun.vod.file.keysecret}")private String keysecret;public static String ACCESSKEY_ID;public static String ACCESSKEY_SECRET;@Overridepublic void afterPropertiesSet() throws Exception {ACCESSKEY_ID = keyId;ACCESSKEY_SECRET = keysecret;}
}

启动后端测试,出现“Could not resolve placeholder ‘xxx‘ in value “ x x x “ , 可 以 参 考 博 客 解 决 : [ C o u l d n o t r e s o l v e p l a c e h o l d e r ‘ x x x ‘ i n v a l u e “ {xxx}“,可以参考博客解决:[Could not resolve placeholder ‘xxx‘ in value “ xxx“,可以参考博客解决:[Couldnotresolveplaceholder‘xxx‘invalue“{xxx}“_pangdongh的博客-CSDN博客_xxx](https://blog.csdn.net/pangdongh/article/details/105289199),在swager-ui:Swagger UI进行测试。

6.2 前端实现

(1)ui实现

之前在chapter.vue中预留了位置进行上传视频(todo),现在将这部分ui替换。

 <el-form-item label="上传视频"><el-upload:on-success="handleVodUploadSuccess":on-remove="handleVodRemove":before-remove="beforeVodRemove":on-exceed="handleUploadExceed":file-list="fileList":action="BASE_API + 'eduvod/video/uploadVideo'":limit="1"class="upload-demo"><el-button size="small" type="primary">上传视频</el-button><el-tooltip placement="right-end"><div slot="content">最大支持1G,<br />支持3GP、ASF、AVI、DAT、DV、FLV、F4V、<br />GIF、M2T、M4V、MJ2、MJPEG、MKV、MOV、MP4、<br />MPE、MPG、MPEG、MTS、OGG、QT、RM、RMVB、<br />SWF、TS、VOB、WMV、WEBM 等视频格式上传</div><i class="el-icon-question" /></el-tooltip></el-upload>
</el-form-item>

(2)数据定义

fileList: [], //上传文件列表
BASE_API: process.env.BASE_API, // 接口API地址

(3)方法实现

  // ------------------ 视频 -------------//上传成功执行方法handleVodUploadSuccess(response,file,fileList){this.video.videoSourceId = response.data.videoIdthis.video.videoOrignalName = file.name},beforeVodRemove(file, fileList){return this.$confirm(`确定移除 ${ file.name }?`);},
6.3 nigix配置

(1)配置上传文件大小限制

client_max_body_size 1024m;

(2)配置转发端口

 location ~ /eduvod/ {proxy_pass http://localhost:8003;}

(3)重启nigix。

# 关闭nginx
nginx.exe -s stop# 启动nginx
nginx.exe

谷粒学院day09——课程发布与阿里云视频点播服务相关推荐

  1. 阿里云-视频点播服务API调用

    视频点播服务 最近公司项目需要用到视频播放及管理,多放选型后准备采用阿里云视频点播服务(公司一直用阿里系) 购买了视频点播存储包和视频点播流量包 首先存储配置 配置管理 -> 媒资管理配置 -& ...

  2. 阿里云视频点播服务的开通和使用

    阿里云视频点播服务的开通和使用 文章目录 阿里云视频点播服务的开通和使用 前言:什么是阿里云视频点播服务? 一.开通阿里云视频点播服务 二.控制台基本操作 三.JAVA JDK操作阿里云视频点播服务 ...

  3. springboot整合阿里云视频点播服务Vod——实现视频上传、删除、播放

    视频点播(ApsaraVideo VoD,简称VoD)是集视频采集.编辑.上传.媒体资源管理.自动化转码处理(窄带高清™).视频审核分析.分发加速于一体的一站式音视频点播解决方案. 阿里云视频点播服务 ...

  4. Spring Boot集成阿里云视频点播服务的过程记录

    阿里云视频点播 效果预览 视频点播 视频点播概述 功能 优势 流程 环境准备 开通视频点播 创建RAM用户并授权 上传SDK 上传流程 下载上传SDK 安装上传SDK 集成Java上传SDK 异常说明 ...

  5. Springboot整合阿里云视频点播服务

    目录 一.阿里云视频点播服务 二.开通视频点播云平台 1.搜索视频点播服务 2.开通视频点播 3.选择按使用流量计费 三.使用SDK 1.添加Jar包依赖 2.application.properti ...

  6. 阿里云视频点播服务Vod工具类——实现视频上传、删除、播放

    阿里云视频点播服务Vod工具类--实现视频上传.删除.播放 阿里云视频点播服务Vod工具类 maven依赖 工具类实现 工具类的测试 获取视频 1. 获取单个视频的播放地址和ID: 2. 获取所有视频 ...

  7. 第三方服务-阿里云视频点播服务java服务端SDK相关代码

    视频点播服务中的视频,也依然是存在OSS上的,但是区别是什么呢?下面关于区别的描述摘自阿里云官网 视频的点播场景涉及视频的存储.转码.分发加速几个环节,那么: 视频点播是集视频音视频采集.编辑.上传. ...

  8. 阿里云视频点播服务SDK的使用,视频文件上传测试

    文章目录 阿里云视频点播技术简介 一.阿里云视频点播技术能力盘点 1.应用场景 2.功能介绍 二.开通视频点播云平台 1.选择视频点播服务 2.开通视频点播 3.选择按使用流量计费 4.资费说明 5. ...

  9. 阿里云视频点播服务(上传,删除,获取播放地址,获取播放凭证)

    一.简介 视频点播(ApsaraVideo for VoD)是集音视频采集.编辑.上传.自动化转码处理.媒体资源管理.分发加速于一体的一站式音视频点播解决方案. 1.应用场景 音视频网站:无论是初创视 ...

最新文章

  1. Spring Boot + Mybatis 多模块(module)项目的完整搭建教程
  2. 中国首个AI考级来了:共分10级,北大出题,工信部认证 | 在线可测,我最多活3级...
  3. STM32F103 系统启动时钟的选择和详细过程
  4. centos7 安装教程 图文流程安装后包含界面
  5. P2502 [HAOI2006]旅行 最小生成树
  6. 16-1 Redis分布式缓存引入与保存缓存功能实现
  7. OpenCV-数组加权和cv::addWeighted
  8. 黄聪:使用Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)
  9. 计算机病毒的历史:1986-1993(译文…
  10. 如何用发票查验软件快速批量查验发票(返回官网查验截图)
  11. VMwarenbsp;vSpherenbsp;ESXiamp;nb…
  12. css-background-image 背景图片太大或太小
  13. 在Chrome安装Edge的插件
  14. iPhone用android充电头,苹果能用安卓充电头吗
  15. 制作动图简易软件(附下载方式)
  16. 3d卷积神经网络应用,神经网络仿真软件
  17. S7-200SMART PLC中书签和交叉引用的具体使用方法示例
  18. MySQL备份恢复方案
  19. Python2 简介
  20. 【Python实训项目】pygame制作【飞机大战】

热门文章

  1. 我的Qt作品(5)使用Qt+Halcon实现模板匹配;支持ROI框选/橡皮擦涂抹功能
  2. 计算机操作系统虚拟内存管理
  3. Java基础算法题(01):判断101-200之间有多少个素数,并输出所有素数。 素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数。也就是素数只有两个因子。
  4. 约数的一些定理——数论
  5. 数据库原理与应用——引言(一)
  6. 3.1-图像分割引言
  7. 理解Memcached缓存[转载]
  8. 中职计算机应用专业课堂教学,谈谈中职计算机应用基础课程教学中翻转课堂研究...
  9. 如何实现网站事件统计与事件分析
  10. 利用RSS进行学术期刊订阅