前言
今天在向腾讯云上传视频的时候,翻阅腾讯云官方文档,发现并没有提供动态上传的方法(只能是绝对路径上传)。这是腾讯云的一个bug,并没有为客户提供较为便利的方法。
官方具体上传视频集成方案https://cloud.tencent.com/document/product/266/10276
接下来提供解决方案:
步骤一:在当前模块引入vod依赖
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>vod_api</artifactId>
<version>2.1.4</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
步骤二:编写Controller
@Api(tags = "腾讯云点播")
@RestController
@RequestMapping("/admin/vod")
@CrossOrigin
public class VodController {
@Autowired
private VodService vodService;
//上传视频
@PostMapping("upload")
public Result uploadVideo(
@ApiParam(name = "file", value = "文件", required = true)
@RequestParam("file") MultipartFile file) throws IOException {
String videoId = vodService.uploadVideo(file);
return Result.ok(videoId);
}
//删除视频
@DeleteMapping("remove/{videoSourceId}")
public Result removeVideo( @PathVariable String videoSourceId) {
vodService.removeVideo(videoSourceId);
return Result.ok(null);
}
}
步骤三:编写service接口及实现类
public interface VodService {
String uploadVideo(MultipartFile file);
void removeVideo(String videoSourceId);
}
@Service
public class VodServiceImpl implements VodService {
@Override
public String uploadVideo(MultipartFile file) {
//创建客户端
VodUploadClient client = new VodUploadClient(ConstantPropertiesUtil.ACCESS_KEY_ID, ConstantPropertiesUtil.ACCESS_KEY_SECRET);
//创建上传请求对象
VodUploadRequest request = new VodUploadRequest();
//设置上传本地路径
String absolutePath = null;
try {
//新建本地文件,用于临时存储视频//a.mp4
File localFile = new File(file.getOriginalFilename());
//本地视频的绝对路径
absolutePath = localFile.getAbsolutePath();
//临时上传
file.transferTo(new File(absolutePath));
request.setMediaFilePath(absolutePath);
VodUploadResponse response = client.upload("ap-beijing", request);
//返回视频id
String fileId = response.getFileId();
return fileId;
} catch (Exception e) {
// 业务方进行异常处理
e.printStackTrace();
} finally {
File temp = new File(absolutePath);
temp.delete();
}
return null;
}
@Override
public void removeVideo(String videoSourceId) {
try{
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
Credential cred =
new Credential(ConstantPropertiesUtil.ACCESS_KEY_ID,
ConstantPropertiesUtil.ACCESS_KEY_SECRET);
// 实例化要请求产品的client对象,clientProfile是可选的
VodClient client = new VodClient(cred, "");
// 实例化一个请求对象,每个接口都会对应一个request对象
DeleteMediaRequest req = new DeleteMediaRequest();
req.setFileId(videoSourceId);
// 返回的resp是一个DeleteMediaResponse的实例,与请求对象对应
DeleteMediaResponse resp = client.DeleteMedia(req);
// 输出json格式的字符串回包
System.out.println(DeleteMediaResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
总结:
由于腾讯云官方的MultipartFile类是需要用IO流来进行文件传输的,但是官方并没有提供具体的IO流上传方法,所以自己实现。
**第一步:**在本地创建临时的文件,并提供地址
**第二步:**根据本地的绝对地址上传到腾讯云
**第三步:**在finally中删除掉本地文件(但是这里有一些不足,就是删除文件的时候应该递归删除,避免文件被占用(文件已打开)的情况下删除不成功的问题。)