阿里云官方链接 https://www.aliyun.com/
阿里云的图片和视频上传流程
图片
前端调用后端,后端通过ak(自己阿里云的) sk(自己阿里云的) region(所属的区域 例如:华东 华北)
后端用这三个参数访问阿里云视频点播平台,返回一个上传凭证,后端将上传凭证给前端,
前端利用上传凭证将媒资上传
阿里云视频点播使用步骤
第一步:导入依赖
<!--阿里云视频点播-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.2</version>
</dependency>
第二步:给配置类中添加阿里云的ak sk region
aliyun.region = 如果是华北2:cn-beijing ,如果是华东2:cn-shanghai
aliyun.accessKeyId = 自己的账号的 accessKeyId
aliyun.accessKeySecret = 自己的账号的accessKeySecret
这样使用@Value再去将配置类中配置阿里云的配置信息读到
第三步:编写代码:例子
/**
* 封装了ak sk regionId
*/
@Autowired
private AliyunConnectInfo connectInfo;
/**
* 音频或视频获取上传凭证的示例
*
* @Description 填入AccessKey信息
*/
private DefaultAcsClient initVodClient(String accessKeyId, String regionId, String accessKeySecret) throws ClientException {
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
/**
* 获取音/视频上传地址和凭证
*
* @return CreateUploadVideoResponse 获取音/视频上传地址和凭证响应数据
* @throws Exception
*/
public VodUploadToken createUploadVideo(VodUploadRequest videoRequest) {
CreateUploadVideoRequest request = new CreateUploadVideoRequest();
//因为我们没有上传视频,所以这个会创建一个空的视频,这样就会导致不能访问,因为视频是空的,而且会一直上传
request.setTitle(videoRequest.getTitle());
request.setFileName(videoRequest.getFileName());
try {
DefaultAcsClient client = initVodClient(connectInfo.getAccessKey(), connectInfo.getRegionId(), connectInfo.getSecretKey());
CreateUploadVideoResponse response = client.getAcsResponse(request);
//上传地址和凭证都是存在时效性的,时效性是50分钟,如果凭证超过50分钟,上传会失败,这时候需要刷新凭证
//视频id 文件的唯一标识 response.getVideoId()
// 上传地址 response.getUploadAddress()
// 上传的凭证 response.getUploadAuth()
//请求id response.getRequestId()
//返回凭证
return VodUploadToken.builder()
.videoId(response.getVideoId())
.requestId(response.getRequestId())
.uploadAddress(response.getUploadAddress())
.uploadAuth(response.getUploadAuth())
.build();
} catch (Exception e) {
log.info("获取音/视频上传地址和凭证失败,错误信息:{}", e.getMessage());
//desc: 保存媒资信息失败 因为前端只会上传,所以上传时找凭证得不到直接就说保存失败
ExceptionCast.cast(MediaErrorCode.E_140001);
return null;
}
}
// 获取媒资链接通过fileID唯一标识
public String getURLUploadInfos(String fileId) {
GetPlayInfoRequest request = new GetPlayInfoRequest();
request.setVideoId(fileId);
String playInfo = null;
try {
DefaultAcsClient client = initVodClient(connectInfo.getAccessKey(), connectInfo.getRegionId(), connectInfo.getSecretKey());
GetPlayInfoResponse response = client.getAcsResponse(request);
//这个list是代表这个视频不同的清晰度,比如一个视频有 1080p 4k 这都是属于同一个视频,所以会把这个视频所有的清晰度的视频查出来
List<GetPlayInfoResponse.PlayInfo> playInfoList = response.getPlayInfoList();
ExceptionCast.cast(CollectionUtils.isEmpty(playInfoList), MediaErrorCode.E_140012);
//播放地址
playInfo = playInfoList.get(0).getPlayURL();
} catch (Exception e) {
log.info("获取媒资URL失败,错误信息:{}", e.getMessage());
//desc: 获取媒资URL失败
ExceptionCast.cast(MediaErrorCode.E_140012);
return playInfo;
}
return playInfo;
}
public void deleteVideo(String fileId) {
DeleteVideoRequest request = new DeleteVideoRequest();
//支持传入多个视频ID,多个用逗号分隔
request.setVideoIds(fileId);
try {
DefaultAcsClient client = initVodClient(connectInfo.getAccessKey(), connectInfo.getRegionId(), connectInfo.getSecretKey());
DeleteVideoResponse response = client.getAcsResponse(request);
String requestId = response.getRequestId();
System.out.println("requestId = " + requestId);
} catch (Exception e) {
log.info("删除Aliyun媒资失败,错误信息:{}", e.getMessage());
//desc: 获取媒资URL失败
ExceptionCast.cast(MediaErrorCode.E_140002);
}
}
// 刷新凭证
public VodUploadToken refreshUploadToken(String videoId) {
// 当前方法在使用过程中,会有不稳定因素
// 不稳定因素:网络
// 特点:第三方的服务
try {
DefaultAcsClient client = AliyunVODUtil.initVodClient(connectInfo.getAccessKey(), connectInfo.getRegionId(), connectInfo.getSecretKey());
RefreshUploadVideoResponse response = AliyunVODUtil.refreshUploadVideo(client, videoId);
VodUploadToken token = VodUploadToken.builder().uploadAuth(response.getUploadAuth())
.requestId(response.getRequestId())
.videoId(response.getVideoId())
.uploadAddress(response.getUploadAddress())
.build();
return token;
} catch (Exception e) {
// 错误胡记录到日志中,日志文件在本地存储,操作时会实际到io
// 在实际工作中,绝对不要出现。
// e.printStackTrace();
log.error(MediaErrorCode.E_140015.getDesc() + " error msg: {}", e.getMessage());
ExceptionCast.cast(MediaErrorCode.E_140015);
return null;
}
}
}
其中上边封装的 ak sk regionId 类(connectInfo)如下
/**
* AK
*/
@Value("${aliyun.accessKeyId}")
private String accessKey;
/**
* SK
*/
@Value("${aliyun.accessKeySecret}")
private String secretKey;
/**
* 区域 这里我们属于 华北2-cn-shanghai
*/
@Value("${aliyun.region}")
private String regionId;
断点上传
断点上传就是采用的分为几部分进行上传,规定一个上传的文件分为几部分,每部分的大小,这样上传的时候就会每部分把自己范围的下载了,等全部上传完毕以后会进行合并成一整个文件
断点上传原理:百度安全验证https://baijiahao.baidu.com/s?id=1590263619161019562&wfr=spider&for=pc
断点上传应用场景
适用于大文件的上传和下载,因为如果小的文件一会儿就下载完了,一般不太会出现问题,如果大文件上传到一般突然停电了或者断网了,这时候就会中断上传,等到下次上传还要从头开始上传,用户体验很不好,这时候就可以使用断点上传