在服务端上传场景下,当推荐的上传方式(如上传SDK)无法满足业务需求时,您还可以基于OSS原生SDK上传媒体。本文提供基于OSS原生SDK上传媒体的流程指引、操作步骤和代码示例。

使用场景

视频点播面向开发者提供了丰富的上传方式,其中上传SDK(分服务端和客户端)封装了上传相关的基础逻辑,仅需简单配置即可实现上传功能,推荐使用。但是服务端上传SDK仅支持Java、Python、 C/C++和PHP四种语言。如果有超出上述语言范围的开发需求(如使用.NET语言、Go语言),可以直接基于OSS原生SDK上传。更多上传方式的介绍请参见媒体上传概述

不同服务端语言支持的上传方式和推荐的上传方式如下表所示:

开发语言 支持的上传方式 推荐的上传方式 备注
Java

点播服务端上传SDK

OSS原生SDK
说明

本文提供上传示例代码。

点播服务端上传SDK

请参见上传SDK(服务端)
Python

点播服务端上传SDK

OSS原生SDK

点播服务端上传SDK

C/C++

点播服务端上传SDK

OSS原生SDK

点播服务端上传SDK

PHP

点播服务端上传SDK

OSS原生SDK
说明

本文提供上传示例代码。

点播服务端上传SDK

Go
OSS原生SDK
说明

本文提供上传示例代码。

-

需集成点播服务端SDK获取长传地址和凭证。

本文提供上传示例代码。

.NET
OSS原生SDK
说明

本文提供上传示例代码。

-
Node.js

OSS原生SDK

-

需集成点播服务端SDK获取长传地址和凭证。

暂无完整的上传示例代码,仅提供操作参考。

上传流程

基于OSS原生SDK上传需要开发者自行实现所有上传逻辑,包括在点播服务获取上传地址和凭证、Base64解码上传地址和凭证以及调用OSS能力完成上传。

以集成点播服务端SDK获取上传地址和凭证为例,完整的上传流程如下图所示:

OSS原生SDK上传流程

流程详解

  1. 上传应用服务器使用RAM用户AK方式(AccessKey ID和AccessKey Secret)或STS临时AK初始化点播客户端。

  2. 上传应用服务器使用点播服务端SDK调用上传地址和凭证相关接口获取上传地址、上传凭证及媒资信息。
    说明 您也可以构造HTTP/HTTPS请求获取上传地址和凭证,但需要自行构造签名,出错概率较高。上传地址和凭证相关接口包括:
  3. 点播服务在请求结果中返回Base64加密的上传地址(UploadAddress)、上传凭证(UploadAuth)、和媒体ID等信息。上传应用服务器可根据返回结果解析参数作为初始化OSS原生SDK的入参。
    说明

    关于解析后的上传地址和凭证说明请参见参考信息:解析上传地址和凭证说明

    点播服务在下发上传地址和凭证时还会自动创建媒资信息,即媒体ID(MediaId),用于媒资生命周期管理或媒体处理。

    • 获取视频上传地址和凭证返回的VideoId即媒体ID。
    • 获取图片上传地址和凭证返回的ImageId即媒体ID。
    • 获取辅助媒资上传地址和凭证返回的MediaId即媒体ID。
    • 请妥善保存媒体ID,作为媒资管理、音视频播放、媒体处理等的输入。
  4. 上传应用服务器使用解析后的上传地址(UploadAddress)和授权信息(UploadAuth),通过STS方式初始化OSS客户端。
    注意 为避免AK信息泄露带来的安全风险,初始化OSS SDK必须使用STS方式
  5. 上传应用服务器使用OSS SDK调用OSS上传相关接口将媒体文件上传至指定的存储地址。

  6. OSS服务返回上传结果。
    说明 上传结果也可以通过提前配置回调接收上传相关事件来监听。

前提条件

  • 您已经开通了视频点播服务。开通步骤请参见开通视频点播服务

  • 您已经完成上传相关的系统配置,包括启用目标存储地域的存储地址和配置回调。操作指引请参见存储管理回调设置
  • 您已准备好用于调用点播服务的账号。为避免阿里云账号AccessKey泄露带来的安全风险,推荐您创建RAM用户并授予其VOD相关权限。然后使用RAM用户的AK对(AccessKey ID和AccessKey Secret)访问点播服务。操作指引请参见创建RAM用户并授权
  • (可选)如需使用STS临时授权方式(阿里云Security Token Service)访问点播服务,请为RAM用户创建角色并授予角色VOD相关权限。操作指引请参见创建角色并进行STS临时授权
    说明 STS临时授权方式的适用场景请参见凭证方式与STS方式对比

操作步骤

视频点播目前提供PHP、Go、Java和.NET语言的详细操作指引和示例代码。
注意 真实业务场景下,请参考接口文档将示例中的参数值替换为与业务场景匹配的真实值。获取上传地址和凭证的接口包括:

示例代码均以上传音视频为例(调用点播CreateUploadVideo接口获取上传地址和凭证)。

Demo源码

针对上述示例,视频点播提供了Demo源码供开发者参考。

语言 源码 更多参考信息
PHP上传Demo PHP版上传Demo源码 OSS-PHP-SDK上传文件
Go上传Demo GO版上传Demo源码 OSS-Go-SDK上传文件
.NET上传Demo .NET版上传Demo源码 OSS-.NET-SDK上传文件
Java上传Demo Java版上传Demo源码 OSS-Java-SDK上传文件

PHP上传示例

步骤一、安装点播服务端SDK

操作指引请参见点播PHP SDK安装

步骤二、安装OSS SDK
注意 环境要求如下:
  • PHP 5.3+,可在终端执行php -v命令查看当前的PHP版本。
  • CURL扩展,可在终端执行php -m命令查看curl扩展是否已经安装好。
  1. 在您的PHP项目中添加空文件夹aliyun-php-sdk
  2. aliyun-openapi-php-sdk下载整个源码。

    解压后拷贝aliyun-php-sdk-corealiyun-php-sdk-vod两个文件夹到aliyun-php-sdk目录下。

  3. aliyun-oss-php-sdk下载最新的OSS PHP SDK的源码。

    解压ZIP文件后添加文件夹到aliyun-php-sdk目录下。以下载V.2.4.3 Source code为例,解压后文件夹为aliyun-oss-php-sdk-2.4.3

步骤三、上传(示例代码)
说明
故障排除方法
  • 如果由于SSL配置异常导致错误(如出现cURL error: SSL certificate problem), 可将HTTPS替换为HTTP后再初始化OssClient。
    $uploadAddress['Endpoint'] = str_replace("https:", "http:", $uploadAddress['Endpoint']);
  • 如果上传凭证过期(默认3000秒),可以刷新上传凭证再上传。刷新凭证的示例代码如下:
    function refresh_upload_video($vodClient, $videoId) {
        $request = new vod\RefreshUploadVideoRequest();
        $request->setVideoId($videoId);
        return $vodClient->getAcsResponse($request);
    }
<?php
//1、在代码中引用VOD和OSS的文件。
require_once './aliyun-php-sdk/aliyun-php-sdk-core/Config.php';   // 假定您的源码文件和aliyun-php-sdk处于同一目录。
require_once './aliyun-php-sdk/aliyun-oss-php-sdk-2.4.3/autoload.php';
use vod\Request\V20170321 as vod;
use OSS\OssClient;
use OSS\Core\OssException;
//2、使用AK对方式初始化VOD客户端。
function init_vod_client($accessKeyId, $accessKeySecret) {
    $regionId = 'cn-shanghai';     // 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai
    $profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
    return new DefaultAcsClient($profile);
}
//3、获取上传地址和凭证
function create_upload_video($vodClient) {
    $request = new vod\CreateUploadVideoRequest();
    $request->setTitle("视频标题");        // 视频标题(必填参数)
    $request->setFileName("文件名称.mov"); // 视频源文件名称,必须包含扩展名(必填参数)
    $request->setDescription("视频描述");  // 视频源文件描述(可选)
    //CoverURL示例:http://example.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-****.png
    $request->setCoverURL("<your Cover URL>"); // 自定义视频封面(可选)
    $request->setTags("标签1,标签2"); // 视频标签,多个用逗号分隔(可选)
    return $vodClient->getAcsResponse($request);
}

//4、使用上传凭证和地址通过STS方式初始化OSS客户端。
function init_oss_client($uploadAuth, $uploadAddress) {
    $ossClient = new OssClient($uploadAuth['AccessKeyId'], $uploadAuth['AccessKeySecret'], $uploadAddress['Endpoint'],
        false, $uploadAuth['SecurityToken']);
    $ossClient->setTimeout(86400*7);    // 设置请求超时时间,单位秒,默认是5184000秒, 建议不要设置太小,如果上传文件很大,消耗的时间会比较长
    $ossClient->setConnectTimeout(10);  // 设置连接超时时间,单位秒,默认是10秒
    return $ossClient;
}
//5、上传。
function upload_local_file($ossClient, $uploadAddress, $localFile) {
    return $ossClient->uploadFile($uploadAddress['Bucket'], $uploadAddress['FileName'], $localFile);
}

$accessKeyId = '<Your AccessKey ID>';                    // 您的AccessKeyId
$accessKeySecret = '<Your AccessKey Secret>';            // 您的AccessKeySecret
$localFile = '/Users/aligame/Downloads/****.mp4';   // 需要上传到VOD的本地视频文件的完整路径
try {
    // 初始化VOD客户端并获取上传地址和凭证
    $vodClient = init_vod_client($accessKeyId, $accessKeySecret);
    $createRes = create_upload_video($vodClient);
    // 执行成功会返回VideoId、UploadAddress和UploadAuth。Base64解码UploadAddress和UploadAuth。
    $videoId = $createRes->VideoId;
    $uploadAddress = json_decode(base64_decode($createRes->UploadAddress), true);
    $uploadAuth = json_decode(base64_decode($createRes->UploadAuth), true);
    // 使用UploadAuth和UploadAddress初始化OSS客户端
    $ossClient = init_oss_client($uploadAuth, $uploadAddress);
    // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关
    $result = upload_local_file($ossClient, $uploadAddress, $localFile);
    printf("Succeed, VideoId: %s", $videoId);
} catch (Exception $e) {
    // var_dump($e);
    printf("Failed, ErrorMessage: %s", $e->getMessage());
}
                

Go上传示例

步骤一、安装点播服务端SDK

操作指引请参见点播Go SDK安装

步骤二、安装OSS SDK
注意 环境要求如下:

支持Go 1.7及以上版本,可到Go官网下载合适的版本安装。

  1. 使用go getglide安装阿里云Go SDK。
    • 使用go get安装阿里云Go SDK。
      go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
      说明
      • 安装过程中,界面不会打印提示,请耐心等待。如发生超时,请再次执行命令。
      • 当GOPATH对应的目录下出现了子目录src/github.com/aliyun/alibaba-cloud-sdk-go/services/vod即表示SDK安装成功。
    • 使用glide安装阿里云Go SDK。
      glide get github.com/aliyun/alibaba-cloud-sdk-go
  2. 安装OSS SDK。操作指引请参见OSS Go SDK安装
步骤三、上传(Go示例代码)
 package main

import (
    "encoding/base64"
    "encoding/json"
    "fmt"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/vod"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)

func InitVodClient(accessKeyId string, accessKeySecret string) (client *vod.Client, err error) {
    // 点播服务接入区域
    regionId := "cn-shanghai"
    // 创建授权对象
    credential := &credentials.AccessKeyCredential{
        accessKeyId,
        accessKeySecret,
    }
    // 自定义config
    config := sdk.NewConfig()
    config.AutoRetry = true     // 失败是否自动重试
    config.MaxRetryTime = 3     // 最大重试次数
    config.Timeout = 3000000000 // 连接超时,单位:纳秒;默认为3秒
    // 创建vodClient实例
    return vod.NewClientWithOptions(regionId, config, credential)
}

func MyCreateUploadVideo(client *vod.Client) (response *vod.CreateUploadVideoResponse, err error) {
    request := vod.CreateCreateUploadVideoRequest()
    request.Title = "Sample Video Title"
    request.Description = "Sample Description"
    request.FileName = "/opt/video/sample/video_file.mp4"
    //request.CateId = "-1"
    //Cover URL示例:http://example.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-****.png
    request.CoverURL = "<your CoverURL>"
    request.Tags = "tag1,tag2"
    request.AcceptFormat = "JSON"
    return client.CreateUploadVideo(request)
}

func InitOssClient(uploadAuthDTO UploadAuthDTO, uploadAddressDTO UploadAddressDTO) (*oss.Client, error) {
    client, err := oss.New(uploadAddressDTO.Endpoint,
        uploadAuthDTO.AccessKeyId,
        uploadAuthDTO.AccessKeySecret,
        oss.SecurityToken(uploadAuthDTO.SecurityToken),
        oss.Timeout(86400*7, 86400*7))
    return client, err
}

func UploadLocalFile(client *oss.Client, uploadAddressDTO UploadAddressDTO, localFile string) {
    // 获取存储空间。
    bucket, err := client.Bucket(uploadAddressDTO.Bucket)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    // 上传本地文件。
    err = bucket.PutObjectFromFile(uploadAddressDTO.FileName, localFile)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
}

type UploadAuthDTO struct {
    AccessKeyId     string
    AccessKeySecret string
    SecurityToken   string
}
type UploadAddressDTO struct {
    Endpoint string
    Bucket   string
    FileName string
}

func main() {
    var accessKeyId string = "<Your AccessKeyId>"           // 您的AccessKeyId
    var accessKeySecret string = "<Your AccessKeySecret>" // 您的AccessKeySecret
    var localFile string = "/opt/video/sample/video_file.mp4"     // 需要上传到VOD的本地视频文件的完整路径
    // 初始化VOD客户端并获取上传地址和凭证
    var vodClient, initVodClientErr = InitVodClient(accessKeyId, accessKeySecret)
    if initVodClientErr != nil {
        fmt.Println("Error:", initVodClientErr)
        return
    }
    // 获取上传地址和凭证
    var response, createUploadVideoErr = MyCreateUploadVideo(vodClient)
    if createUploadVideoErr != nil {
        fmt.Println("Error:", createUploadVideoErr)
        return
    }
    // 执行成功会返回VideoId、UploadAddress和UploadAuth
    var videoId = response.VideoId
    var uploadAuthDTO UploadAuthDTO
    var uploadAddressDTO UploadAddressDTO
    var uploadAuthDecode, _ = base64.StdEncoding.DecodeString(response.UploadAuth)
    var uploadAddressDecode, _ = base64.StdEncoding.DecodeString(response.UploadAddress)
    json.Unmarshal(uploadAuthDecode, &uploadAuthDTO)
    json.Unmarshal(uploadAddressDecode, &uploadAddressDTO)
    // 使用UploadAuth和UploadAddress初始化OSS客户端
    var ossClient, _ = InitOssClient(uploadAuthDTO, uploadAddressDTO)
    // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关
    UploadLocalFile(ossClient, uploadAddressDTO, localFile)
    //MultipartUploadFile(ossClient, uploadAddressDTO, localFile)
    fmt.Println("Succeed, VideoId:", videoId)
}
                

Java上传示例

注意 环境要求如下:
  • 环境要求使用Java 1.8及以上版本。
  • 可在终端执行java -version命令查看Java版本。

步骤一、安装点播服务端SDK

操作指引请参见点播Java SDK集成

步骤二、安装OSS SDK

操作指引请参考OSS Java SDK安装

步骤三、上传(Java代码示例)
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSSClient;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoRequest;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse;
import org.apache.commons.codec.binary.Base64;

import java.io.File;

/**
 * descript
 *
public class UploadDemo {

    public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
        // 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai;其他区域请参见存储说明。
        String regionId = "cn-shanghai";
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);
        return client;
    }

    public static CreateUploadVideoResponse createUploadVideo(DefaultAcsClient vodClient) throws ClientException {
        CreateUploadVideoRequest request = new CreateUploadVideoRequest();
        request.setFileName("vod_test.mp4");
        request.setTitle("this is title");
        //request.setDescription("this is desc");
        //request.setTags("tag1,tag2");
        //CoverURL示例:http://example.aliyundoc.com/test_cover_****.jpg
        //request.setCoverURL("<your CoverURL>");
        //request.setCateId(-1L);
        //request.setTemplateGroupId("");
        //request.setWorkflowId("");
        //request.setStorageLocation("");
        //request.setAppId("app-1000000");
        //设置请求超时时间
        request.setSysReadTimeout(1000);
        request.setSysConnectTimeout(1000);
        return vodClient.getAcsResponse(request);
    }

    public static OSSClient initOssClient(JSONObject uploadAuth, JSONObject uploadAddress) {
        String endpoint = uploadAddress.getString("Endpoint");
        String accessKeyId = uploadAuth.getString("AccessKeyId");
        String accessKeySecret = uploadAuth.getString("AccessKeySecret");
        String securityToken = uploadAuth.getString("SecurityToken");
        return new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
    }

    public static void uploadLocalFile(OSSClient ossClient, JSONObject uploadAddress, String localFile) {
        String bucketName = uploadAddress.getString("Bucket");
        String objectName = uploadAddress.getString("FileName");
        File file = new File(localFile);
        ossClient.putObject(bucketName, objectName, file);
    }

    public static void main(String[] argv) {
        //您的AccessKeyId
        String accessKeyId = "<Your AccessKeyId>";
        //您的AccessKeySecret
        String accessKeySecret = "<Your AccessKeySecret>";
        //需要上传到VOD的本地视频文件的完整路径,需要包含文件扩展名
        String localFile = "/Users/yours/Video/testVideo.flv";
        try {
            // 初始化VOD客户端并获取上传地址和凭证
            DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);
            CreateUploadVideoResponse createUploadVideoResponse = createUploadVideo(vodClient);
            // 执行成功会返回VideoId、UploadAddress和UploadAuth
            String videoId = createUploadVideoResponse.getVideoId();

            JSONObject uploadAuth = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAuth()));
            JSONObject uploadAddress = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAddress()));

            // 使用UploadAuth和UploadAddress初始化OSS客户端
            OSSClient ossClient = initOssClient(uploadAuth, uploadAddress);
            // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关
            uploadLocalFile(ossClient, uploadAddress, localFile);
            System.out.println("Put local file succeed, VideoId : " + videoId);
        } catch (Exception e) {
            System.out.println("Put local file fail, ErrorMessage : " + e.getLocalizedMessage());
        }
    }

    private static String decodeBase64(String data) {
        return new String(Base64.decodeBase64(data));
    }
}
                

.NET上传示例

注意 环境要求如下:
  • .NET Framework 4.6.1及其以上版本。
  • .NET Standard 2.0及其以上版本。

步骤一、安装点播服务端SDK

操作指引请参见点播.NET SDK集成

步骤二、安装OSS SDK并初始化

操作指引请参见OSS .NET SDK安装

步骤三、初始化点播客户端

示例代码
public static DefaultAcsClient InitVodClient(string accessKeyId, string accessKeySecret)
{
    // 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai
    string regionId = "cn-shanghai";
    IClientProfile profile = DefaultProfile.GetProfile(regionId, accessKeyId, accessKeySecret);
    return new DefaultAcsClient(profile);
}

步骤四、完成上传

  1. 获取上传地址和凭证(以上传视频为例)。
    public static CreateUploadVideoResponse CreateUploadVideo(DefaultAcsClient vodClient)
    {
        CreateUploadVideoRequest request = new CreateUploadVideoRequest();
        request.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON;
        request.FileName = "vod_test.mp4";
        request.Title = "this is title";
        //request.Description = "<文件描述>";
        //request.Tags = "<标签,多个标签用逗号分开>";
        //CoverURL示例:http://example.aliyundoc.com/test_cover_****.jpg
        //request.CoverURL = "<视频封面>";
        //媒体分类。登录点播控制台
        //request.CateId = -1;
        //转码模板组ID。登录点播控制台
        //request.TemplateGroupId = "<转码模板组ID>";
        //工作流ID。可登录点播控制台
        //request.WorkflowId = "<工作流ID>";
        //存储地址。登录点播控制台
        //request.StorageLocation = "<存储地址>";
        //AppId为固定取值。
        //request.AppId = "app-1000000";
        //设置请求超时时间
        request.SetReadTimeoutInMilliSeconds(1000);
        request.SetConnectTimeoutInMilliSeconds(1000);
        return vodClient.GetAcsResponse(request);
    }
  2. Base64解析获取到的UploadAddress和UploadAuth。
  3. 使用上传凭证和地址初始化OSS客户端。
    注意
    • 需要先Base64解码并JSON Decode再传入。
    • 必须使用STS方式初始化OSS客户端。
    示例代码
    public static OssClient InitOssClient(JObject uploadAuth, JObject uploadAddress) 
    {
        string endpoint = uploadAddress.GetValue("Endpoint").ToString();
        string accessKeyId = uploadAuth.GetValue("AccessKeyId").ToString();
        string accessKeySecret = uploadAuth.GetValue("AccessKeySecret").ToString();
        string securityToken = uploadAuth.GetValue("SecurityToken").ToString();
        return new OssClient(endpoint, accessKeyId, accessKeySecret, securityToken);
    }
  4. 上传本地文件。
    示例代码
    public static void UploadLocalFile(OssClient ossClient, JObject uploadAddress, string localFile) 
    {
        string bucketName = uploadAddress.GetValue("Bucket").ToString();
        string objectName = uploadAddress.GetValue("FileName").ToString();
        ossClient.PutObject(bucketName, objectName, localFile);
    }
  5. (可选)如果上传凭证过期,可刷新上传凭证再上传。
    示例代码
    public static RefreshUploadVideoResponse RefreshUploadVideo(DefaultAcsClient vodClient)
    {
        RefreshUploadVideoRequest request = new RefreshUploadVideoRequest();
        request.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON;
        request.VideoId = "VideoId";
        //设置请求超时时间
        request.SetReadTimeoutInMilliSeconds(1000);
        request.SetConnectTimeoutInMilliSeconds(1000);
        return vodClient.GetAcsResponse(request);
    }
  6. 执行完整流程(注意捕获异常)。
    示例代码
    //您的AccessKeyId
    string accessKeyId = "<Your AccessKeyId>"; 
    //您的AccessKeySecret
    string accessKeySecret = "<Your AccessKeySecret>";
    //需要上传到VOD的本地视频文件的完整路径,需要包含文件扩展名
    string localFile = "/Users/yours/Video/testVideo.flv";
    try {
        // 初始化VOD客户端并获取上传地址和凭证
        DefaultAcsClient vodClient = InitVodClient(accessKeyId, accessKeySecret);
        CreateUploadVideoResponse createUploadVideoResponse = CreateUploadVideo(vodClient);
        // 执行成功会返回VideoId、UploadAddress和UploadAuth
        String videoId = createUploadVideoResponse.VideoId;
        JObject uploadAuth = JObject.Parse(Base64Decode(createUploadVideoResponse.UploadAuth));
        JObject uploadAddress = JObject.Parse(Base64Decode(createUploadVideoResponse.UploadAddress));
        // 使用UploadAuth和UploadAddress初始化OSS客户端
        OssClient ossClient = InitOssClient(uploadAuth, uploadAddress);
        // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关
        UploadLocalFile(ossClient, uploadAddress, localFile);
        Console.WriteLine("Put local file succeed, VideoId : " + videoId);
    } 
    catch (Exception e) 
    {
        Console.WriteLine("Put local file fail, ErrorMessage : " + e.Message);
    }

更多语言操作指引

如果上传SDK和上述上传示例依然不能满足业务需求,请参考下表获取更多语言的操作参考。
说明 点播上传SDK已覆盖的语言以及已有完整示例的语言不再赘述。
开发语言 点播服务端SDK OSS原生SDK
Node.js
  1. 点播Node.js SDK安装
  2. 点播Node.js SDK初始化
  3. 点播Node.js SDK获取上传地址和凭证示例
  1. OSS Node.js SDK安装
  2. OSS Node.js SDK初始化
  3. OSS Node.js SDK上传文件

参考信息:解析上传地址和凭证说明

Base64解析上传地址(UploadAddress)和上传凭证(UploadAuth),得到OSS的上传地址和授权信息。解析后的上传地址和授权信息可用于初始化OSS客户端。
说明 Base64解析为较常用的开发者功能,本文不提供具体的解析工具,仅提供解析后的参数说明。
表 1. UploadAddress解析后字段
字段 描述
Bucket 点播存储地址。
Endpoint 点播存储地域标识。
FileName 点播系统为上传文件分配的文件名。
ObjectPrefix 当且仅当上传文件是M3U8文件时返回。
表 2. UploadAuth解析后字段
字段 描述
AccessKeyId 上传用户的AccessKey ID。
AccessKeySecret 上传用户的AccessKey Secret。
SecurityToken 上传授权安全令牌。
ExpireUTCTime 上传地址和凭证过期时间。
Expiration 上传授权过期时间,视频为3000秒,过期需要刷新上传凭证。
Region 上传地域标识。

以下是上传地址和凭证解析前后的示例:

UploadAddress及UploadAuth解析前
{
"VideoId": "1c1255e7e58d4d7487d0c1852954****",
"UploadAddress": "eyJFbmRwb2ludCI6Imh0dHBzOi8vb3NzLWNuLXNoYW5naGFpLmFsaXl1bmNzLmNvbSIsIkJ1Y2tldCI6InZvZC1zaGFuZ2hhaS1rYXNpIiwiRmlsZU5hbWUiOiJ2b2QtZjFlOGM0L3N2LzFhYmUyZDVjLTE3ZWU3Zjc3ZjA0LzFhYmUyZDVjLTE3ZWU3Zjc3ZjA0Lm1w****",
"RequestId": "2975D91A-F89F-5EBF-97D5-07028C90****",
"UploadAuth": "eyJTZWN1cml0eVRva2VuIjoiQ0FJUzhRUjFxNkZ0NUIyeWZTaklyNWZNQ3Z6NWg1aFEzWVc2VVhmVDEwNFpXUGtVaHE3Z3B6ejJJSGhFZjNWdEErOGN0LzQxbFdsVzUvWWFscklxRk1NVkhSMlVNWkFvdjgwT3ExLzdKb0hidk5ldTBic0hoWnY5OEtzbG9waThqcUhvZU96Y1lJNzN2cHpQQWdtMldFUVJySkwrY1RLOUpaZlBVL21nZ29KbWFkSTZSeFN4YVNFOGF2NWRPZ3BscnIzNFh4bTBNdTIyWUNiM25rM2FEa2RqcG1nYWpuaGt1NXk0MmRHNzRCalRoMEdZc3VnT3ZOYllPb0NwYWNWTE5wVnlXTXZYdXV0dGJmamgzU2RjekJKSStheHE3dFZENGl5VmtkeUJKRk5UN2g2YUZ1ZkkrNzhjS3hSaU5JazhHckpGcGVUeHNPQjhwdTNMbnA3cjlnNUpPdWhaTVYvWVg1dnk1ZGJBQk9LeFA4d2xTSzcvUEgzQnNMYUlMWUtuamhzZ1puc1hEQXBRWjdoYkxXUnJXeUUwVGpiVEpwZXU0a3poWlIreUtkdUN5N3BrK3AxdzExSGw0ZGV2T2x5VFFxMlF5em9sSXBzN1prOUtSeGtOeGo3SWVLZ2NieWxSZDA5bUg3K1BVYmhyYUJkWHBjR1l1aGJKQkFsaDFXMXlvdm5pWnV2Zm9Md2ljWUg0VjU1ZHMrOGFmNDhVbDJveFUyeitVYTYxOEZoMkVsWm9XckZMeXFMZ0ZJYWk0YnVldW9XcGJQWEJGK29NdHlkcEV3SFlwREhmVG1oTGYyK2pwSTg5YmxiZDRNVFl5cVBNK3BJbEV3STE1NWRCQ2czQWY0OWcvMWM2cExDc3FFMmErdUs1WGkyaHV6Tm45OVNIOGRZUTV4TTRPYTZ0aWVMSXNtUFYrU1hQYktSbWxwaUlWalV6QnhHdkoxNEJtYS9PMWlwVzkweGF5ekR0WWt4RHNXNzhqempnSUpjcHRkV1EzVzVCRDZ0cG51RFZkaXl0NUcwSUM2alN1K1pRQmI0NEk3b1hDS3p0aEY4NGxxWDkwelMwdXB6Y3R5bENTOEw1ZWJJN1o1SnlCQmIrOEJzNXppV3FXRGtKR29BQmg1Z3M3YlVOZEs2NGdVaThRM2tOdWpVZFdiZTFTb1Y1cVZJOEdmTkYvZ1g0MUNvWGlrSHhwN3FwOTBpMFBSd1h5VUc4WEVkVGUxY3RZbGEwZG9WeGhtNThOQVdoR0pEOXQxK21iWjd4ZUFkczNqT3NpSUNPb25Ib3JWYmNUb0s2VGs3cjNxejZHSlgybE54djVmWTBvUWZsSTJNQWR0cHo5WnJidnZ5eUFjYz0iLCJBY2Nlc3NLZXlJZCI6IlNUUy5OVHlBRk1qR3FqR1FTUWIzTkxUdjhpa0tFIiwiRXhwaXJlVVRDVGltZSI6IjIwMjItMDItMTFUMDk6NTc6NDNaIiwiQWNjZXNzS2V5U2VjcmV0IjoiOWZGUXQyeVJSWTZGMVBFb0hNS1dMYmFmeHlSd1BNNjFuRUhDbzZDTWlQZCIsIkV4cGlyYXRpb24iOiIzNjAwIiwiUmVnaW9uIjoiY24tc2hhbmdoYWk****"
}
UploadAddress解析后
{
"Endpoint": "https://******.aliyuncs.com",
"Bucket": "vod-shanghai-****",
"FileName": "vod-f1e8c4/sv/1abe2d5c-17ee7f77f04/1abe2d5c-17ee7f7****.mp4"
}
注意 如果上传的是M3U8文件,UploadAddress解析后,会有ObjectPrefix字段值。示例如下:
M3U8文件UploadAddress解析后
{
"Endpoint": "https://******.aliyuncs.com",
"Bucket": "vod-shanghai-****",
"ObjectPrefix": "vod-f1e8c4/sv/4b9c68b2-17ee8156****”,
"FileName": "vod-f1e8c4/sv/4b9c68b2-17ee81564e7/4b9c68b2-17ee815****.m3u8"
}
UploadAuth解析后
{
"SecurityToken": "CAIS8QR1q6Ft5B2yfSjIr5fMCvz5h5hQ3YW6UXfT104ZWPkUhq7gpzz2IHhEf3VtA+8ct/41lWlW5/YalrIqFMMVHR2UMZAov80Oq1/7JoHbvNeu0bsHhZv98Kslopi8jqHoeOzcYI73vpzPAgm2WEQRrJL+cTK9JZfPU/mggoJmadI6RxSxaSE8av5dOgplrr34Xxm0Mu22YCb3nk3aDkdjpmgajnhku5y42dG74BjTh0GYsugOvNbYOoCpacVLNpVyWMvXuuttbfjh3SdczBJI+axq7tVD4iyVkdyBJFNT7h6aFufI+78cKxRiNIk8GrJFpeTxsOB8pu3Lnp7r9g5JOuhZMV/YX5vy5dbABOKxP8wlSK7/PH3BsLaILYKnjhsgZnsXDApQZ7hbLWRrWyE0TjbTJpeu4kzhZR+yKduCy7pk+p1w11Hl4devOlyTQq2QyzolIps7Zk9KRxkNxj7IeKgcbylRd09mH7+PUbhraBdXpcGYuhbJBAlh1W1yovniZuvfoLwicYH4V55ds+8af48Ul2oxU2z+Ua618Fh2ElZoWrFLyqLgFIai4bueuoWpbPXBF+oMtydpEwHYpDHfTmhLf2+jpI89blbd4MTYyqPM+pIlEwI155dBCg3Af49g/1c6pLCsqE2a+uK5Xi2huzNn99SH8dYQ5xM4Oa6tieLIsmPV+SXPbKRmlpiIVjUzBxGvJ14Bma/O1ipW90xayzDtYkxDsW78jzjgIJcptdWQ3W5BD6tpnuDVdiyt5G0IC6jSu+ZQBb44I7oXCKzthF84lqX90zS0upzctylCS8L5ebI7Z5JyBBb+8Bs5ziWqWDkJGoABh5gs7bUNdK64gUi8Q3kNujUdWbe1SoV5qVI8GfNF/gX41CoXikHxp7qp90i0PRwXyUG8XEdTe1ctYla0doVxhm58NAWhGJD9t1+mbZ7xeAds3jOsiICOonHorVbcToK6Tk7r3qz6GJX2lNxv5fY0oQflI2MAdtpz9Zrbvvy****",
"AccessKeyId": "STS.NTyAFMjGqjGQSQb3NLTv8****",
"ExpireUTCTime": "2022-02-11T******",
"AccessKeySecret": "9fFQt2yRRY6F1PEoHMKWLbafxyRwPM61nEHCo6C****",
"Expiration": "****",
"Region": "cn-shanghai"
}