音视频点播vod-奇异果体育app竞彩官网下载
场景概述
vod 用户通过web上传,是vod使用需求中很典型的一种应用场景。在该场景下,用户通常采用应用服务器中转的模型进行文件上传。
- 用户先将文件通过web上传到应用服务器;
- 应用服务器再将文件上传到vod。
这个模型的优点比较明显:
- 客户端和 vod 服务器没有任何交互工作,所有和 vod 的交互都由服务器完成,非常简单和安全;
- 服务器可以精确控制用户的行为,添加各种自定义流程。
但是这个模型的缺点也显而易见:
- 上传速度慢。因为需要经过应用服务器中转,与客户端数据直传到 vod 相比,网络传送增加了一倍。
- 扩展性差。随着用户数量的增加,应用服务器可能成为传输瓶颈。
- 成本高。应用服务器的部署和维护需要一定成本,如客户端数据直传到vod,将节省应用服务器的开销,且目前vod上传的流量是免费的。
如果您的应用需要符合这个场景的话,我们推荐您使用"bce-bos-uploader"工具实现客户端直传vod的方式。
bce-bos-uploader
baidu cloud engine bos uploader()是百度智能云基于javascript sdk开发的一个ui组件,为了方便用户开发web直传应用而专门提供的,使用该工具用很少的几行代码就可以完成跟bos服务的对接。由于 vod 服务依赖和集成了bos服务,所以bce-bos uploader的一个git分支提供了一个页面,对一个已经开启了bos、vod、doc服务的用户,根据源文件类型智能的上传到bos、vod或者doc服务。
本文重点讲述如何在3in1页面中直传vod,用户可以根据实际需要对此3in1功能和界面进行自定义修改,详细操作参见在浏览器中直接上传文件到vod。
bce-bos-uploader的demo操作界面如下:
支持的浏览器
基于xhr2和file api,可以支持ie10 , firefox,chrome和opera最新版。 借助postobject接口,可以支持ie低版本(6,7,8,9),详细请参见:通过postobject接口处理ie低版本。
签名方式
bce-bos-upload支持默认、sts、postobject三种签名方式。
默认签名方式即使用ak/sk签名方式在浏览器中直接上传文件到 vod 中。通过浏览器直传文件到vod服务器的时候,如果把ak和sk暴露在页面中,会引发安全性的问题。攻击者获取了ak和sk,可以对vod甚至百度智能云其他服务上面的数据进行任意的操作。这模式仅可用于开发期间进行本地测试,请勿在生产环境中使用。
使用sts签名更安全灵活,它可以对用户的使用权限进行灵活、精确地控制,而且不必每次请求都调用后端接口,在有效期内就可以不用再请求新的security token。
因为ie低版本(ie6,7,8,9)对 html5 api 支持的不完善,为了在这些浏览器里面实现文件直传的功能,vod服务中的存储服务bos提供了postobject接口,支持了 multipart/form-data 的请求格式,方便在低版本的ie下面把文件上传到bos服务器。
在浏览器中直接上传文件到vod
使用bce-bos-uploader,可以参考下面的内容完成如何在浏览器中直接上传文件到vod。
操作流程
- 注册百度智能云账号,实名认证,开通vod服务。
-
查询ak/sk。
在百度智能云控制台奇异果体育app竞彩奇异果体育app竞彩官网下载官网下载首页右上角的“安全认证->access key” 查询ak和sk的信息,也可以在bucket管理中查看。
-
初始化bce-bos-uploader参数。
获取bce-bos-uploader 通过github下载:
-
修改moe/3in1.js中的:
var ak = getquery('ak', '替换为你的ak'); var sk = getquery('sk', '替换为你的sk');
并把整个包都部署到服务器上。
-
启动webserver
通过php来启动
php -s 0.0.0.0:9999通过python来启动
python -m simplehttpserver 9999
启动webserver之后,在浏览器里面访问 http://your_server:your_port/bce-bos-uploader-gh-pages/moe/3in1.html
打开刚才的页面,开始测试是否可以正常上传。
注意:
“moe/3in1.js” 是集合了百度智能云vod、百度智能云doc、百度智能云bos的三合一服务。这个js的默认策略是:根据媒资后缀名的不同,自动上传至不同的服务。
- 后缀为avi、mp4、flv、rm、rmvb、webm类型的媒资,将上传到百度智能云vod;
- 后缀为txt、pdf、doc、docx、ppt、pptx、xls、xlsx类型的文件,将上传到百度智能云doc;
- 其余类型默认上传到bos。以3in1.js中的实际方法为准。
为了达到自动分渠道这个目标,您需要合理配置doc和bos相关的服务,修改moe/3in1.js中的var vod_exts、var doc_exts、以及function getkey(file)方法,来实现自己的业务逻辑。
举例:如果您仅开通了vod服务,只希望用这块代码上传vod,可以修改”3in1.js”中的function getkey(file)方法,直接return getvodkey(file);
即可。
进阶篇一:sts临时认证
bce-bos-uploader支持sts(security token service)临时授权的方式。服务端生成一组具体特定操作权限、具有一定时效性的临时ak/sk,这组临时的ak/sk可以暴露给浏览器端直接使用。用户只需要将服务端返回的ak/sk及sessiontoken设置为bce-bos-uploader对应的bos-ak、bos-sk和uptoken参数。
下图简单介绍了整个业务交互过程,关于sts方面的介绍请参考临时授权访问。
代码实现分为应用服务器端和客户端两部分,实现过程如下:
应用服务器端nodejs实现
配置应用服务器端,以nodejs实现为例,服务器端会返回ak/sk/sessiontoken。 配置浏览器,根据服务器端返回的ak/sk/sessiontoken初始化bce-bos-uploader参数。
应用服务器端nodejs实现:
var http = require('http');
var url = require('url');
var util = require('util');
var sts = require('@baiducloud/sdk').sts;
var kcredentials = {
ak: '您的ak',
sk: '您的sk'
};
function buildstsresponse() {
var stsclient = new sts({
credentials: kcredentials,
region: 'bj'
});
return stsclient.getsessiontoken(60 * 60 * 24, {
accesscontrollist: [{
service: 'bce:bos',
resource: ['vod-gcqgg7xk0eqr78je/*'],
region: '*',
effect: 'allow',
permission: ['write']
}]
}).then(function (response) {
var body = response.body;
return {
accesskeyid: body.accesskeyid,
secretaccesskey: body.secretaccesskey,
sessiontoken: body.sessiontoken,
expiration: body.expiration
};
});
}
http.createserver(function (req, res) {
console.log(req.url);
var query = url.parse(req.url, true).query;
var promise = null;
if (query.sts) {
promise = buildstsresponse();
}
promise.then(function (payload) {
res.writehead(200, {
'content-type': 'text/javascript; charset=utf-8',
'access-control-allow-origin': '*'
});
if (query.callback) {
res.end(util.format('%s(%s)', query.callback, json.stringify(payload)));
}
else {
res.end(json.stringify(payload));
}
});
}).listen(1337);
console.log('server running at http://0.0.0.0:1337/');
注意:
resource: ['vod-gcqgg7xk0eqr78je/*']
这一行需要自定义,具体参考。
在服务器端,用与创建bosclient实例类似的方式创建一个stsclient实例。对于stsclient实例,主要有一个方法,那就是getsessiontoken。这个方法接收两个参数,第一个参数是临时授权的有效期,以秒为单位;第二个单位是具体的权限控制。
这个方法会异步访问sts授权服务器,返回一个promise对象。sts授权服务器会返回类似如下内容:
{
body: {
"accesskeyid": "d87a16e5ce1d47c1917b38ed03fbb329",
"secretaccesskey": "e9b6f59ce06c45cdaaea2296111dab46",
"sessiontoken": "mjuzzjqznty4ote0ndrknjg3n2e4yzjhztc4ymu5zdh8aaaaabwcaab/hfhdvv2bu5xuf6rapt2ydslg6 21utc62ehviuiaamtumqqknkr9pu2njgvbuwgbn8ot0atk0hnwyqggwgyew24htbrx3gfir/cdymcowm0ti6ogq7k8pgubicczt8qzcarh7vdzbd1lkpyaxbtp7wqjqiochdxrswrcd j/i2cesqt6mjimmvupuv06r89dwbl/vcu7jqpdybk0d5cp2b gdahddbobevlbmkqw50/ooykjiuho4wn7fgogpmpdod0pf0s7lw/hgsnpojzcgrl0pihs197rp3gwpnljryfdcy0g0gfg6t0/fsqdbxbi8lwzf1qrtmjzzh2tax8xopfkgmbpntp//vgp7opyk1joes34tjcdcznlzirnvigazazmzmuhpexe5rvx1w8jpexmjjhsrfs3lje13o9dwg==",
"createtime": "2016-02-16t14:01:29z",
"expiration": "2016-02-16t15:41:29z",
"userid": "5e433c4a8fe74765a7ec6fc147e25c80"
}
}
服务器端需要把accesskeyid、secretaccesskey、sessiontoken三个字段下发给浏览器端。
配置浏览器端bce-bos-uploader参数
使用sts临时授权机制时,只需要在各个服务初始化的时候把上面所说的参数accesskeyid、secretaccesskey、sessiontoken引入就可以了。对3in1.html来说,就是在服务器向客户端分发3in1.js时候,修改掉其中的
var ak = getquery('ak', '您从sts申请到的临时ak'); var sk = getquery('sk', '您从sts申请到的临时sk '); var session_token = '您从sts申请到的临时token';
以及对3in1.js代码中的多处 // uptoken: session_token, 中的uptoken解除注释。
再次测试,在浏览器中抓包,发现authorization头中有x-bce-security-token字样,且成功,说明sts模式直传vod测试成功。
进阶篇二:通过postobject接口处理ie低版本
vod服务中,上传服务是基于bos来提供。
因为ie低版本(ie8,ie9)对html5支持的不完善,为了在这些浏览器里面实现文件直传的功能,bos开发了postobject接口,通过一个multipart/form-data的格式,就可以把文件上传到bos服务器。postobject接口的签名模式下应用服务器端对policy生成签名,再返回给客户端。
bce-bos-uploader已经实现了对这个接口的支持,使用之前需要进行额外的配置工作。
服务器端返回uptoken_url参数: 使用postobject处理ie低版本时,需要在bce-bos-uploader中配置uptoken_url参数,关于 uptoken_url如何实现详细代码请参见uptoken代码示例。
然后修改3in1.js:
var uptoken_url = 'http://localhost.baidu.com:7788/ack';
修改为你的实际的服务器的ack接口。 再次部署和访问,就可以在ie低版本下运行3in1.html。
综上所述,用户先用真实的ak、sk在在浏览器中直接上传文件到bos模式下开始简单测试,然后通过开发和配置“sts临时认证“的方式实现在ie高版本以及其他浏览器下的安全上传,再理解和部署ack接口,实现通过postobject接口处理ie低版本。部署到线上正式服务的时候,3in1.js会自动根据浏览器来选择sts模式或者ack模式进行上传。