背景:
最近由于公司需要上传视频并可以播放的需求,因此用到了腾讯云的云点播功能,直接用的web客户端上传,代码简单,非常容易,但也踩过了一些坑,特地记录下。作为一个多年经验但是技术能力差强人意的php开发工程师,一套很简单的代码,被我玩了一天。
官方文档:
API文档:https://cloud.tencent.com/document/product/266/9239
踩过的坑:
写在前头,千万不要什么都跟官方文档来!!! 1,提交时,若是提示uploader.ts:355 Uncaught (in promise) Error: ugc upload | invalid request,不要以为真的是权限的问题,或者是secret_id 和secret_key有问题,第一反应应该是你签名有没有问题。 官方文档上,是通过
function getSignature() {
return axios.post(url).then(function (response) {
return response.data.signature;
})
};
获取后台签名 ,这是有问题的,上面是错的!!!,因为返回的是一个promise对象!!! 需要同步获取,或者是获取完,再进行上传调用,例如:
var getSignature = async function getSignature() {
var mySign = ''
await axios.post('/career/get_tencent_vod_sign').then(function (response) {
mySign = response.data.signature;
});
return mySign ;
};
如果是用ajax写的,可以参考下面的代码
2,注意控制上传文件类型和大小
主要代码:
php模块(获取签名):
public static function getSign($expire = 86400){
$secret_id = "**************";
$secret_key = "**************";
$current = time();
$expired = $current + $expire;
$arg_list = array(
"classId" => '**********',
"secretId" => $secret_id,
"currentTimeStamp" => $current,
"expireTime" => $expired,
"random" => rand());
$original = http_build_query($arg_list);
$sign = base64_encode(hash_hmac('SHA1', $original, $secret_key, true).$original);
return $sign;
}
js模块(处理业务):
bindEvent: function bindEvent() {
var _self = this;
//选择文件
$(document).on("click", '.chooseFile', function () {
$('.vExampleFile').trigger('click');
});
//点击上传
$(document).on("change", '.vExampleFile', function () {
_self.mediaUpload();
});
},
//文件上传
mediaUpload: function mediaUpload() {
var _self = this;
var mediaFile = $(".vExampleFile")[0].files[0];
//判断文件大小
if (mediaFile.size > 200 * 1024 * 1024) {
$.showMessage('上传视频不能大于200M');
return false;
}
//判断视频时长
var url = URL.createObjectURL(mediaFile);
var videos = document.createElement('video');
videos.src = url;
//需要等一会儿
setTimeout(function () {
if (videos.readyState > 0) {
var minutes = parseInt(videos.duration / 60, 10);
var seconds = videos.duration % 30;
if (minutes > 60) {
$.showMessage('上传视频时长不能大于30分钟');
return;
}
//获取云点播的签名
$.ajax({
url:"后台接口地址",
method:"post",
success:function(res){
var _sign = res.data.signature;
if(_sign === '' || _sign === 'undefined' || _sign === null) {
$.showMessage('获取签名失败');
return;
}
//上传到腾讯云点播
_self.vodUpload(_sign);
},
error:function(err){
$.showMessage(err);
return;
}
})
}
}, 500);
},
//上传到腾讯云点播
vodUpload: function vodUpload(_sign) {
var _self = this;
var tcVod = new TcVod.default({
getSignature: function getSignature() {
return _sign;
}
});
var content = "<span class=\"ui-dialog-loading\"></span>";
var stateDialog = $.dialog({
width: 130,
content: '<span class="ui-dialog-loading"></span><div style="text-align: center;">' + content + '文件准备中...</div>'
});
stateDialog.show();
var mediaFile = $(".vExampleFile")[0].files[0];
var uploader = tcVod.upload({
mediaFile: mediaFile
});
//上传进度
uploader.on('media_progress', function (info) {
//console.log(info);
var media_pencent = (info.percent * 100).toFixed(2);
stateDialog.content(content + "上传进度:" + media_pencent + '%');
});
//上传完成
uploader.on('media_upload', function (info) {
//console.log(info);
});
//上传完成回调
uploader.done().then(function (doneResult) {
//console.log(doneResult);
stateDialog.close();
$.showMessage('上传成功');
//回调函数
call_back_func(doneResult);
//其中 doneResult 包含下列一些字段
// url: doneResult.video.url,
// title: mediaFile.name,
// fileId: doneResult.fileId
});
}
|