在之前的文章中: 阿里云视频点播上传视频和获取视频播放地址,介绍了后端上传视频和上传完成后获取播放地址交由前端点击播放地址进行播放。
本文将通过获取上传凭证来上传视频,这种方式更好
共分为几下几步:
一、通过角色获取临时身份凭证(STS Token)
二、使用临时身份凭证获取获取上传地址,上传凭证等信息
三、使用上传地址和凭证等信息将由前端进行上传
下面开始细说上面的三大步:
在开始之前请先到阿里云的RAM访问控制完成用户及角色创建、开通视频点播功能,并完成设置
一、通过角色获取临时身份凭证(STS Token)
参考官方文档: 创建RAM角色并进行STS临时授权、 获取临时身份凭证
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.auth.credentials import AccessKeyCredential
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdksts.request.v20150401.AssumeRoleRequest import AssumeRoleRequest
credentials = AccessKeyCredential('你的AccessKey ID', '你的AccessKey Secret') # 在RAM访问控制中创建的用户里创建这两个值(不要使用阿里云主账号的AccessKey)
# use STS Token
# credentials = StsTokenCredential('<your-access-key-id>', '<your-access-key-secret>', '<your-sts-token>')
client = AcsClient(region_id='cn-shanghai', credential=credentials)
request = AssumeRoleRequest()
request.set_accept_format('json')
policy_text = '{"Version": "1","Statement": [{"Action": "vod:*","Resource": "*","Effect": "Allow"}]}'
request.set_RoleArn("acs:ram::1745xxxx24070:role/vxxxxcess") # 在RAM访问控制中的角色里获取ARN
request.set_RoleSessionName("session-name")
request.set_Policy(policy_text) # 权限策略
request.set_DurationSeconds(3600) # 过期时间
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
代码中的注释有更详细的说明及注意点
返回结果:在返回结果中有了我们要的临时身份凭证AccessKeyId,AccessKeySecret和SecurityToken
二、使用临时身份凭证获取获取上传地址,上传凭证等信息
参考官方文档: STS初始化、 获取音/视频上传地址和凭证
from aliyunsdkvod.request.v20170321 import CreateUploadVideoRequest
import json
import traceback
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.auth.credentials import StsTokenCredential
# 填入STS信息
def init_vod_client(accessKeyId, accessKeySecret, securityToken):
regionId = 'cn-shanghai' # 点播服务接入地域
connectTimeout = 3 # 连接超时,单位为秒
credential = StsTokenCredential(accessKeyId, accessKeySecret, securityToken)
return AcsClient(region_id=regionId, auto_retry=True, max_retry_time=3, timeout=connectTimeout, credential=credential)
def create_upload_video(clt):
request = CreateUploadVideoRequest.CreateUploadVideoRequest()
request.set_Title('支部简介替换111') # 设置文件名
request.set_FileName('F:/Download/支部简介替换.mp4') # 文件地址目录
request.set_Description('这是视频的描述')
# CoverURL示例:"http://192.168.0.1/16/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png"
# request.set_CoverURL('<your Cover URL>')
# request.set_Tags('tag1,tag2')
# request.set_CateId(0)
request.set_accept_format('JSON')
response = json.loads(clt.do_action_with_exception(request))
return response
try:
clt = init_vod_client('临时身份凭证AccessKeyId', '临时身份凭证AccessKeySecret', '临时身份凭证SecurityToken')
uploadInfo = create_upload_video(clt)
print(uploadInfo['UploadAuth']) # 上传凭证
print(json.dumps(uploadInfo, ensure_ascii=False, indent=4)) # 包括上传凭证的所有信息
except Exception as e:
print(e)
print(traceback.format_exc())
在上面代码返回的结果中包括了我们需要的UploadAddress(上传地址)、UploadAuth(上传凭证)VideoId(视频ID号)
运行完成之后在视频点播页面中就可以看到状态为上传中的视频了,这个时候我们需要将UploadAddress(上传地址)、UploadAuth(上传凭证)VideoId(视频ID号)交给前端,由前端完成上传。
三、使用上传地址和凭证等信息交由前端进行上传
前端示例demo代码下载: 前端上传代码
手动将前端部分代码修改为后端返回的UploadAddress(上传地址)、UploadAuth(上传凭证)VideoId(视频ID号)
请将前端代码uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress, videoId) 中的uploadAuth, uploadAddress, videoId参数替换为后端返回的值进行运行前端代码测试上传功能(原先动态axios获取的代码先注释掉)
运行起来的前端页面展示:
上传完成:
视频点播中再次查看,状态已显示正常