• 谷粒学院 —— 10、课程管理:整合阿里云视频点播


    目录

    1、创建模块

    1.1、引入视频点播所需依赖

    1.2、application.properties

    1.3、启动类

    2、实现视频上传

    2.1、后端

    2.1.1、创建常量类

    2.1.2、上传视频到阿里云

    2.2、配置 nginx

    2.3、前端

    2.3.1、上传视频组件

    2.3.2、方法定义

    3、视频删除

    3.1、后端

    3.1.1、初始化阿里云视频点播客户端

    3.1.2、根据视频 ID 删除阿里云视频

    3.2、前端

    3.2.1、定义 API

    3.2.2、定义组件方法


    1、创建模块

    在 service 下创建 service_vod 模块

    1.1、引入视频点播所需依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>com.aliyungroupId>
    4. <artifactId>aliyun-java-sdk-coreartifactId>
    5. <version>4.6.0version>
    6. dependency>
    7. <dependency>
    8. <groupId>com.aliyungroupId>
    9. <artifactId>aliyun-java-sdk-vodartifactId>
    10. <version>2.16.11version>
    11. dependency>
    12. <dependency>
    13. <groupId>com.alibabagroupId>
    14. <artifactId>fastjsonartifactId>
    15. <version>1.2.83version>
    16. dependency>
    17. <dependency>
    18. <groupId>com.aliyungroupId>
    19. <artifactId>aliyun-java-sdk-kmsartifactId>
    20. <version>2.10.1version>
    21. dependency>
    22. <dependency>
    23. <groupId>com.aliyungroupId>
    24. <artifactId>aliyun-java-sdk-coreartifactId>
    25. <version>4.5.1version>
    26. dependency>
    27. <dependency>
    28. <groupId>com.aliyun.ossgroupId>
    29. <artifactId>aliyun-sdk-ossartifactId>
    30. <version>3.10.2version>
    31. dependency>
    32. <dependency>
    33. <groupId>com.aliyungroupId>
    34. <artifactId>aliyun-java-sdk-vodartifactId>
    35. <version>2.16.11version>
    36. dependency>
    37. <dependency>
    38. <groupId>com.alibabagroupId>
    39. <artifactId>fastjsonartifactId>
    40. <version>1.2.83version>
    41. dependency>
    42. <dependency>
    43. <groupId>org.jsongroupId>
    44. <artifactId>jsonartifactId>
    45. <version>20170516version>
    46. dependency>
    47. <dependency>
    48. <groupId>com.google.code.gsongroupId>
    49. <artifactId>gsonartifactId>
    50. <version>2.8.2version>
    51. dependency>
    52. <dependency>
    53. <groupId>com.aliyungroupId>
    54. <artifactId>aliyun-sdk-vod-uploadartifactId>
    55. <version>1.4.15version>
    56. dependency>
    57. <dependency>
    58. <groupId>com.baomidougroupId>
    59. <artifactId>mybatis-plus-boot-starterartifactId>
    60. dependency>
    61. dependencies>

    1.2、application.properties

    1. # 服务端口
    2. server.port=8003
    3. # 服务名
    4. spring.application.name=service-vod
    5. # 环境设置:dev、test、prod
    6. spring.profiles.active=dev
    7. #阿里云 vod
    8. #不同的服务器,地址不同
    9. aliyun.vod.file.keyid=accessKeyId
    10. aliyun.vod.file.keysecret=accessKeySecret
    11. # 最大上传单个文件大小:默认1M
    12. spring.servlet.multipart.max-file-size=1024MB
    13. # 最大置总上传的数据大小 :默认10M
    14. spring.servlet.multipart.max-request-size=1024MB

    1.3、启动类

    1. @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) // 不加载数据库
    2. @ComponentScan(basePackages = {"com.zyj"}) // 扫描包
    3. public class VodApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(VodApplication.class, args);
    6. }
    7. }

    2、实现视频上传

    2.1、后端

    2.1.1、创建常量类

    1. @Component
    2. public class ConstantVodUtils implements InitializingBean {
    3. public static String ACCESS_KEY_ID;
    4. public static String ACCESS_KEY_SECRET;
    5. @Value("${aliyun.vod.file.keyid}")
    6. private String accessKeyId;
    7. @Value("${aliyun.vod.file.keysecret}")
    8. private String accessKeySecret;
    9. @Override
    10. public void afterPropertiesSet() throws Exception {
    11. ACCESS_KEY_ID = accessKeyId;
    12. ACCESS_KEY_SECRET = accessKeySecret;
    13. }
    14. }

    2.1.2、上传视频到阿里云

    VodService

    1. public interface VodService {
    2. /**
    3. * 上传视频到阿里云
    4. * @param file 视频文件
    5. * @return 上传后的视频ID
    6. */
    7. String uploadVideo(MultipartFile file);
    8. }

    VodServiceImpl

    1. @Service
    2. public class VodServiceImpl implements VodService {
    3. /**
    4. * 上传视频到阿里云
    5. * @param file 视频文件
    6. * @return 上传后的视频ID
    7. */
    8. @Override
    9. public String uploadVideo(MultipartFile file) {
    10. try {
    11. String accessKeyId = ConstantVodUtils.ACCESS_KEY_ID;
    12. String accessKeySecret = ConstantVodUtils.ACCESS_KEY_SECRET;
    13. String fileName = file.getName(); // 上传文件输入流
    14. String title = fileName.substring(0, fileName.lastIndexOf("."));; // 阿里云的文件名
    15. InputStream inputStream = file.getInputStream();
    16. UploadStreamRequest request = new UploadStreamRequest(accessKeyId, accessKeySecret, title, fileName, inputStream);
    17. UploadVideoImpl uploader = new UploadVideoImpl();
    18. UploadStreamResponse response = uploader.uploadStream(request);
    19. String videoId = null;
    20. if (response.isSuccess()) {
    21. videoId = response.getVideoId();
    22. } else {
    23. //如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因
    24. videoId = response.getVideoId();
    25. }
    26. return videoId;
    27. } catch (Exception e) {
    28. e.printStackTrace();
    29. return null;
    30. }
    31. }
    32. }

    VodController

    1. @RestController
    2. @CrossOrigin
    3. @RequestMapping("/vod/video")
    4. @Api(description="阿里云视频点播微服务")
    5. public class VodController {
    6. @Autowired
    7. private VodService vodService;
    8. /**
    9. * 上传视频到阿里云
    10. * @param file 视频文件
    11. * @return
    12. */
    13. @ApiOperation("上传视频到阿里云")
    14. @PostMapping("/uploadAliyunVideo")
    15. public R uploadAliyunVideo(MultipartFile file) {
    16. String videoId = vodService.uploadVideo(file);
    17. return R.ok().data("videoId", videoId);
    18. }
    19. }

    2.2、配置 nginx

    在 nginx.conf 中的 server{} 中配置

    1. location ~ /vod/ {
    2. proxy_pass http://localhost:8003;
    3. }

    在 server{} 的 server_name 下配置

    client_max_body_size 1024m;

    2.3、前端

    2.3.1、上传视频组件

    src\views\edu\course\chapter.vue

    1. <el-form-item label="上传视频">
    2. <el-upload
    3. :on-success="handleVodUploadSuccess"
    4. :on-remove="handleVodRemove"
    5. :before-remove="beforeVodRemove"
    6. :on-exceed="handleUploadExceed"
    7. :file-list="fileList"
    8. :action="BASE_API +'/vod/video/uploadAliyunVideo'"
    9. :limit="1"
    10. class="upload-demo"
    11. >
    12. <el-button size="small" type="primary">上传视频el-button>
    13. <el-tooltip placement="right-end">
    14. <div slot="content">最大支持1G,<br>
    15. 支持3GP、ASF、AVI、DAT、DV、FLV、F4V、<br>
    16. GIF、M2T、M4V、MJ2、MJPEG、MKV、MOV、MP4、<br>
    17. MPE、MPG、MPEG、MTS、OGG、QT、RM、RMVB、<br>
    18. SWF、TS、VOB、WMV、WEBM 等视频格式上传div>
    19. <i class="el-icon-question" />
    20. el-tooltip>
    21. el-upload>
    22. el-form-item>

    2.3.2、方法定义

    首先在 data 中定义

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

    然后定义方法

    1. /**
    2. * 上传视频成功调用的方法:赋值上传后视频的ID及文件名
    3. */
    4. handleVodUploadSuccess(response, file, fileList) {
    5. this.video.videoSourceId = response.data.videoId;
    6. this.video.videoOriginalName = file.name;
    7. },
    8. // 试图上传多于一个视频
    9. handleUploadExceed(files, fileList) {
    10. this.$message.warning('想要重新上传视频,请先删除已上传的视频');
    11. },

    3、视频删除

    3.1、后端

    3.1.1、初始化阿里云视频点播客户端

    1. public class InitVodClient {
    2. /**
    3. * 初始化阿里云视频点播客户端
    4. * @param accessKeyId
    5. * @param accessKeySecret
    6. * @return
    7. * @throws ClientException
    8. */
    9. public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
    10. String regionId = "cn-shanghai"; // 点播服务接入地域
    11. DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
    12. DefaultAcsClient client = new DefaultAcsClient(profile);
    13. return client;
    14. }
    15. }

    3.1.2、根据视频 ID 删除阿里云视频

    官方文档:媒资管理

    1. /**
    2. * 根据视频ID删除阿里云中的视频
    3. * @param videoId
    4. * @return
    5. */
    6. @DeleteMapping("/{videoId}")
    7. public R deleteAliyunVideo(
    8. @ApiParam(name = "videoId", value = "视频ID", required = true) @PathVariable String videoId
    9. ) {
    10. try {
    11. // 初始化客户端
    12. DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
    13. // 创建删除视频 request 对象
    14. DeleteVideoRequest request = new DeleteVideoRequest();
    15. // 像 request 对象设置视频ID
    16. request.setVideoIds(videoId);
    17. // 调用初始化对象方法实现删除
    18. client.getAcsResponse(request);
    19. return R.ok();
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. throw new GuliException(20001, "删除视频失败");
    23. }
    24. }

    3.2、前端

    3.2.1、定义 API

    src\api\edu\video.js

    1. /**
    2. * 根据视频ID删除阿里云中的视频
    3. * @param {*} videoId
    4. * @returns
    5. */
    6. deleteAliyunVod(videoId) {
    7. return request({
    8. url: `/vod/video/${videoId}`,
    9. method: 'DELETE',
    10. })
    11. }

    3.2.2、定义组件方法

    1. /**
    2. * 上传视频时删除列表中的视频
    3. */
    4. beforeVodRemove(file, fileList) {
    5. return this.$confirm(`确定移除 ${file.name}?`);
    6. },
    7. /**
    8. * 根据视频ID删除阿里云中的视频
    9. */
    10. handleVodRemove() {
    11. video.deleteAliyunVod(this.video.videoSourceId)
    12. // 删除成功
    13. .then(response => {
    14. // 提示信息
    15. this.$message({
    16. type: 'success',
    17. message: '删除视频成功!'
    18. });
    19. // 清空文件列表
    20. this.fileList = [];
    21. // 初始化小节中的视频ID和名称
    22. this.video.videoSourceId = '';
    23. this.video.videoOriginalName = '';
    24. })
    25. // 删除失败
    26. .catch(() => {
    27. this.$message({
    28. type: 'info',
    29. message: '已取消删除'
    30. });
    31. });
    32. }

  • 相关阅读:
    C语言:结构体
    分布式事务的应用场景
    hadoop伪分布式安装部署
    用Python实现感知机学习算法及其对偶算法实验报告
    ImageEn FMX内置图像效果对话框
    Golang 程序漏洞检测利器 govulncheck(二):漏洞数据库详解
    SpringBoot 单体服务集成nacos
    C# 程序开机自动启动
    IP地址怎么实现https
    React技巧之打开文件输入框
  • 原文地址:https://blog.csdn.net/Mr_zhangyj/article/details/127850945