解决腾讯云上传视频没有具体IO方法的bug问题

前言

今天在向腾讯云上传视频的时候,翻阅腾讯云官方文档,发现并没有提供动态上传的方法(只能是绝对路径上传)。这是腾讯云的一个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中删除掉本地文件(但是这里有一些不足,就是删除文件的时候应该递归删除,避免文件被占用(文件已打开)的情况下删除不成功的问题。)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值