1.项目结构
2.代码分析
package com.grain.vod.controller;
import com.aliyuncs.exceptions.ClientException;
import com.grain.common.result.Result;
import com.grain.vod.service.VodService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author:Dragon Wen
* @email:18475536452@163.com
* @date:Created in 2020/3/7 17:33
* @description:
* @modified By:
* @version: $
*/
@Api("阿里云视频点播微服务")
@RestController
@RequestMapping("vod")
@CrossOrigin
public class VodController {
@Autowired
private VodService vodService;
@ApiOperation(value = "上传视频")
@PostMapping("upload")
public Result uploadVideo(
@ApiParam(name = "file", value = "文件", required = true)
@RequestParam("file") MultipartFile file) throws Exception {
String videoSourceId = vodService.uploadVideo(file);
return Result.ok().data("videoSourceId", videoSourceId);
}
/**
* 根据视频ID删除视频
* @return
*/
@ApiOperation(value = "删除视频")
@DeleteMapping("{videoSourceId}")
public Result deleteVideoById(@PathVariable String videoSourceId){
Boolean flag = vodService.deleteVodById(videoSourceId);
if(flag){
return Result.ok();
}
return Result.error();
}
/**
* 批量删除视频
* @return
*/
@ApiOperation(value = "批量删除视频")
@DeleteMapping("removeList")
public Result removeVideoList(
@ApiParam(name = "videoIdList", value = "云端视频id", required = true)
@RequestParam("videoIdList") List videoIdList){
Boolean flag = vodService.removeVideoList(videoIdList);
if(flag){
return Result.ok();
}
return Result.error();
}
@ApiOperation(value = "获取播放凭证")
@GetMapping("get-play-auth/{videoId}")
public Result getVideoPlayAuth(
@ApiParam(name = "videoId", value = "云端视频id", required = true)
@PathVariable String videoId) throws ClientException {
String playAuth = vodService.getVideoPlayAuth(videoId);
return Result.ok().data("playAuth", playAuth);
}
}
package com.grain.vod.service;
import com.aliyuncs.exceptions.ClientException;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author:Dragon Wen
* @email:18475536452@163.com
* @date:Created in 2020/3/7 17:37
* @description:
* @modified By:
* @version: $
*/
public interface VodService {
/**
*
* @param file
* @return
*/
String uploadVideo(MultipartFile file);
/**
* 根据视频ID删除视频
* @param videoSourceId
* @return
*/
Boolean deleteVodById(String videoSourceId);
/**
* 批量删除云端视频
* @param videoIdList
* @return
*/
Boolean removeVideoList(List videoIdList);
/**
* 获取播放凭证
* @param videoId
* @return
*/
String getVideoPlayAuth(String videoId) throws ClientException;
}
package com.grain.vod.service.impl;
import com.aliyun.vod.upload.impl.UploadVideoImpl;
import com.aliyun.vod.upload.req.UploadStreamRequest;
import com.aliyun.vod.upload.resp.UploadStreamResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.vod.model.v20170321.DeleteVideoRequest;
import com.aliyuncs.vod.model.v20170321.DeleteVideoResponse;
import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthRequest;
import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse;
import com.grain.common.exception.EduException;
import com.grain.vod.service.VodService;
import com.grain.vod.utils.AliyunVodSDKUtil;
import com.grain.vod.utils.VodConstantPropertiesUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author:Dragon Wen
* @email:18475536452@163.com
* @date:Created in 2020/3/7 17:40
* @description:
* @modified By:
* @version: $
*/
@Service
@Slf4j
public class VodServiceImpl implements VodService {
@Override
public String uploadVideo(MultipartFile file) {
try {
InputStream inputStream = file.getInputStream();
String originalFilename = file.getOriginalFilename();
String title = originalFilename.substring(0, originalFilename.lastIndexOf("."));
UploadStreamRequest request = new UploadStreamRequest(
VodConstantPropertiesUtil.ACCESS_KEY_ID,
VodConstantPropertiesUtil.ACCESS_KEY_SECRET,
title, originalFilename, inputStream);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadStreamResponse response = uploader.uploadStream(request);
//如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。
// 其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因
String videoId = response.getVideoId();
if (!response.isSuccess()) {
String errorMessage = "阿里云上传错误:" + "code:" + response.getCode() + ", message:" + response.getMessage();
log.warn(errorMessage);
if(StringUtils.isEmpty(videoId)){
throw new EduException(20001, errorMessage);
}
}
return videoId;
} catch (IOException e) {
throw new EduException(20001, "grain vod 服务上传失败");
}
}
@Override
public Boolean deleteVodById(String videoSourceId) {
try {
DefaultAcsClient client = AliyunVodSDKUtil.initVodClient(
VodConstantPropertiesUtil.ACCESS_KEY_ID,
VodConstantPropertiesUtil.ACCESS_KEY_SECRET);
DeleteVideoResponse response = new DeleteVideoResponse();
DeleteVideoRequest request = new DeleteVideoRequest();
//支持传入多个视频ID,多个用逗号分隔
request.setVideoIds(videoSourceId);
response = client.getAcsResponse(request);
return true;
} catch (Exception e) {
log.warn("ErrorMessage = " + e.getLocalizedMessage());
return false;
}
}
@Override
public Boolean removeVideoList(List videoIdList) {
try {
//初始化
DefaultAcsClient client = AliyunVodSDKUtil.initVodClient(
VodConstantPropertiesUtil.ACCESS_KEY_ID,
VodConstantPropertiesUtil.ACCESS_KEY_SECRET);
//创建请求对象
//一次只能批量删20个
String str = org.apache.commons.lang.StringUtils.join(videoIdList.toArray(), ",");
DeleteVideoRequest request = new DeleteVideoRequest();
request.setVideoIds(str);
//获取响应
DeleteVideoResponse response = client.getAcsResponse(request);
System.out.print("RequestId = " + response.getRequestId() + "\n");
return true;
} catch (ClientException e) {
throw new EduException(20001, "视频删除失败");
}
}
@Override
public String getVideoPlayAuth(String videoId){
try {
//初始化
DefaultAcsClient client = AliyunVodSDKUtil.initVodClient(
VodConstantPropertiesUtil.ACCESS_KEY_ID,
VodConstantPropertiesUtil.ACCESS_KEY_SECRET);
//请求
GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
request.setVideoId(videoId);
//响应
GetVideoPlayAuthResponse response = client.getAcsResponse(request);
//得到播放凭证
String playAuth = response.getPlayAuth();
return playAuth;
} catch (ClientException e) {
e.printStackTrace();
throw new EduException(20001, "获取视频播放凭证失败");
}
}
}
package com.grain.vod.utils;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
/**
* @author:Dragon Wen
* @email:18475536452@163.com
* @date:Created in 2020/3/7 15:03
* @description:
* @modified By:
* @version: $
*/
public class AliyunVodSDKUtil {
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;
}
}
3.配置文件
# 服务端口
server.port=8003
# 服务名
spring.application.name=grain-video
# 环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 vod
#不同的服务器,地址不同
aliyun.vod.file.keyid=请填写你的OSS keyid
aliyun.vod.file.keysecret=请填写你的OSS keysecret
# 最大上传单个文件大小:默认1M
spring.servlet.multipart.max-file-size=1024MB
# 最大置总上传的数据大小 :默认10M
spring.servlet.multipart.max-request-size=1024MB
#指定注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8004/eureka/
#eureka服务器上获取的是服务器的ip地址,否则是主机名
eureka.instance.prefer-ip-address=true
4.pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>GrainOnlineEducation_Parent</artifactId>
<groupId>com.grain</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>GrainOnlineEducation_Video</artifactId>
<description>视频点播微服务</description>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.2</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>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-vod-upload</artifactId>
<version>1.4.11</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>com.grain</groupId>
<artifactId>GrainOnlineEducation_Common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--服务注册-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<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>
</project>
模块大多大同小异。