If the upload SDKs provided by ApsaraVideo VOD cannot meet your requirements for uploading files from application servers, you can upload media files by using Object Storage Service (OSS) SDKs. This topic describes the process of uploading media files by using OSS SDKs. This topic also describes the procedure and sample code of using OSS SDKs for specific programming languages.

Scenarios

ApsaraVideo VOD allows you to upload media files by using various methods. The server and client upload SDKs encapsulate fundamental upload logic. You only need to complete simple configurations before you can upload media files. We recommended that you use the upload SDKs to upload media files. However, the server upload SDKs support only the Java, Python, C, C++, and PHP programming languages. If you are using other programming languages such as .NET and Go, you can use OSS SDKs to upload media files. For more information about upload methods, see Overview.

The following table describes the supported and recommended upload methods for different programming languages.

Programming language Supported upload method Recommended upload method Description
Java

Server upload SDK

OSS SDK
Note

This topic provides the sample code of uploading media files by using the OSS SDK.

Server upload SDK

For more information, see Upload from servers.
Python

Server upload SDK

OSS SDK

Server upload SDK

C/C++

Server upload SDK

OSS SDK

Server upload SDK

PHP

Server upload SDK

OSS SDK
Note

This topic provides the sample code of uploading media files by using the OSS SDK.

Server upload SDK

Go
OSS SDK
Note

This topic provides the sample code of uploading media files by using the OSS SDK.

-

You must integrate an ApsaraVideo VOD server operation SDK to obtain upload URLs and credentials.

This topic provides the sample code of uploading media files by using the OSS SDK.

.NET
OSS SDK
Note

This topic provides the sample code of uploading media files by using the OSS SDK.

-
Node.js

OSS SDK

-

You must integrate an ApsaraVideo VOD server operation SDK to obtain upload URLs and credentials.

This topic describes the procedure to upload media files by using the OSS SDK. No sample code is provided.

Upload process

To upload media files by using OSS SDKs, you must implement the logic for the entire upload process. You need to obtain upload URLs and credentials from ApsaraVideo VOD, decode the Base64-encoded upload URLs and credentials, and then use OSS SDKs to upload media files.

The following figure shows the complete upload process. In this example, an ApsaraVideo VOD server operation SDK is integrated to obtain upload URLs and credentials.

Upload process

Process description

  1. An application server uses the AccessKey ID and AccessKey secret of a RAM user or a temporary AccessKey pair issued by Security Token Service (STS) to initialize an ApsaraVideo VOD client.

  2. The application server calls one of the following operations by using the ApsaraVideo VOD server operation SDK to obtain an upload URL, an upload credential, and media asset information.
    Note You can also construct an HTTP or HTTPS request to obtain the upload URL and credential. However, you must manually sign the request, which has a high error probability. For more information about the API operations related to upload URLs and credentials, see the following topics:
  3. ApsaraVideo VOD returns the Base64-encoded upload URL in the uploadAddress parameter, the Base64-encoded upload credential in the uploadAuth parameter, and information such as the media ID. The application server decodes the returned parameters and uses the decoded information as input parameters to initialize the OSS SDK.
    Note

    For more information about decoded upload URLs and credentials, see Notes for decoding upload URLs and credentials.

    ApsaraVideo VOD generates media IDs when it issues upload URLs and credentials. Media IDs can be used for lifecycle management and media processing.

    • For a video, the media ID is returned in the VideoId parameter.
    • For an image, the media ID is returned in the ImageId parameter.
    • For an auxiliary media asset, the media ID is returned in the MediaId parameter.
    • Properly keep the returned media IDs, which are required in subsequent tasks, such as media asset management, audio and video playback, and media processing.
  4. The application server uses the decoded upload URL and credential to initialize an OSS client with an STS token.
    Important To prevent the leakage of your AccessKey pair, you must use STS tokens to initialize OSS SDKs.
  5. The application server calls an operation by using the OSS SDK to upload media files to the specified storage locations.

  6. The OSS client returns the upload result.
    Note You can also set callbacks for the upload-related events to receive the upload result.

Prerequisites

  • ApsaraVideo VOD is activated. For more information, see Activate ApsaraVideo VOD.

  • The system settings required for the upload, including the storage path in the specified region and the callback settings, are configured. For more information, see Manage VOD storage and Configure callbacks.
  • A RAM user is created and used to access ApsaraVideo VOD. To prevent security risks caused by the leakage of the AccessKey pair of your Alibaba Cloud account, we recommend that you create a RAM user and grant the RAM user the permissions required to access ApsaraVideo VOD. Then, you can use the AccessKey pair of the RAM user to access ApsaraVideo VOD. For more information, see Create and grant permissions to a RAM user.
  • Optional. A role is created for the RAM user and the role is granted the permissions required to access ApsaraVideo VOD if you want to access ApsaraVideo VOD by using Security Token Service (STS). For more information, see Create a RAM role and grant temporary access permissions to the role by using STS.
    Note For more information about the scenarios in which STS can be used, see Comparison between credentials and STS.

Procedure

Important Replace the values of parameters in the sample code with the actual values based on your business requirements. For more information about the API operations related to upload URLs and credentials, see the following topics:

In the sample code, video files are uploaded. The CreateUploadVideo operation is called to obtain upload URLs and credentials.

Source code of the demo

The source code of the upload demo is provided for your reference. The following table provides the links to the source code of the upload demo in different programming languages.

Language Source code References
PHP Source code of the upload demo for PHP OSS SDK for PHP
Go Source code of the upload demo for Go OSS SDK for Go
.NET Source code of the upload demo for .NET OSS SDK for .NET
Java Source code of the upload demo for Java OSS SDK for Java

Procedure and sample code of using the OSS SDK for PHP

Step 1: Install the server operation SDK of ApsaraVideo VOD

For more information, see Installation.

Step 2: Install the OSS SDK
Important Prepare the environment by performing the following operations:
  • Install PHP 5.3 or later. To check the PHP version, run the php -v command on the CLI.
  • Install the cURL extension. To check whether the cURL extension is installed, run the php -m command on the CLI.
  1. Download the latest source code package of the OSS SDK for PHP from the aliyun-oss-php-sdk page.
  2. Decompress the package and copy the decompressed folder to the aliyun-php-sdk folder.

    For example, if aliyun-oss-php-sdk-2.4.3.zip is downloaded and decompressed, the decompressed folder is aliyun-oss-php-sdk-2.4.3. For more information, see Installation.

Step 3: Upload media files
Note
Notes for troubleshooting
  • If an error such as "cURL error: SSL certificate problem" occurs due to improper SSL configurations, replace https with http before you initialize an OSS client.
    $uploadAddress['Endpoint'] = str_replace("https:", "http:", $uploadAddress['Endpoint']);
  • If the upload credential expires, you must update the upload credential and upload the media file again. By default, an upload credential is valid for 3,000 seconds. The following sample code provides an example on how to update an upload credential:
    function refresh_upload_video($vodClient, $videoId) {
        $request = new vod\RefreshUploadVideoRequest();
        $request->setVideoId($videoId);
        return $vodClient->getAcsResponse($request);
    }
<?php
// 1. Reference the files of ApsaraVideo VOD and OSS in the code. 
require_once './aliyun-php-sdk/aliyun-php-sdk-core/Config.php';   // In this example, your source code file is in the aliyun-php-sdk folder. 
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. Initialize an ApsaraVideo VOD client by using an AccessKey pair. 
function init_vod_client($accessKeyId, $accessKeySecret) {
    $regionId = 'cn-shanghai';     // The storage region of ApsaraVideo VOD. Example: cn-shanghai.
    $profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
    return new DefaultAcsClient($profile);
}
// 3. Obtain an upload URL and an upload credential.
function create_upload_video($vodClient) {
    $request = new vod\CreateUploadVideoRequest();
    $request->setTitle("Video title");        // Required. The title of the video.
    $request->setFileName("File name.mov"); // Required. The name of the source video file, which must contain a file name extension.
    $request->setDescription("Video description");  // Optional. The description of the source video file.
    // Sample URL of the video thumbnail: http://example.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-****.png.
    $request->setCoverURL("<URL of the video thumbnail>"); // Optional. The custom video thumbnail.
    $request->setTags("Tag 1,Tag 2"); // Optional. The tags of the video. Separate multiple video tags with commas (,).
    return $vodClient->getAcsResponse($request);
}

// 4. Use the upload URL and credential to initialize an OSS client with an STS token. 
function init_oss_client($uploadAuth, $uploadAddress) {
    $ossClient = new OssClient($uploadAuth['AccessKeyId'], $uploadAuth['AccessKeySecret'], $uploadAddress['Endpoint'],
        false, $uploadAuth['SecurityToken']);
    $ossClient->setTimeout(86400*7);   // The request timeout period. Unit: seconds. Default value: 5184000. We recommend that you set the parameter to a large value because the upload of large files takes a long time.
    $ossClient->setConnectTimeout(10);  // The connection timeout period. Unit: seconds. Default value: 10.
    return $ossClient;
}
// 5. Upload a video file. 
function upload_local_file($ossClient, $uploadAddress, $localFile) {
    return $ossClient->uploadFile($uploadAddress['Bucket'], $uploadAddress['FileName'], $localFile);
}

$accessKeyId = '<Your AccessKey ID>';                    // Your AccessKey ID.
$accessKeySecret = '<Your AccessKey Secret>'; // Your AccessKey secret.
$localFile = '/Users/aligame/Downloads/****.mp4';   // The full path of the local video file to be uploaded to ApsaraVideo VOD.
try {
    // Initialize an ApsaraVideo VOD client and obtain an upload URL and an upload credential.
    $vodClient = init_vod_client($accessKeyId, $accessKeySecret);
    $createRes = create_upload_video($vodClient);
    // If the preceding code is successfully executed, the videoId, uploadAddress, and uploadAuth parameters are returned. Decode the Base64-encoded upload URL and upload credential. 
    $videoId = $createRes->VideoId;
    $uploadAddress = json_decode(base64_decode($createRes->UploadAddress), true);
    $uploadAuth = json_decode(base64_decode($createRes->UploadAuth), true);
    // Use the obtained upload URL and upload credential to initialize an OSS client.
    $ossClient = init_oss_client($uploadAuth, $uploadAddress);
    // Upload a video file. Take note that multiple parts are uploaded in parallel. The system starts to upload the next file only when all parts of the current file have been uploaded. The consumed time depends on the file size and upstream bandwidth.
    $result = upload_local_file($ossClient, $uploadAddress, $localFile);
    printf("Succeed, VideoId: %s", $videoId);
} catch (Exception $e) {
    // var_dump($e);
    printf("Failed, ErrorMessage: %s", $e->getMessage());
}
                

Procedure and sample code of using the OSS SDK for Go

Step 1: Install the server operation SDK of ApsaraVideo VOD

For more information, see Installation.

Step 2: Install the OSS SDK
Important Prepare the environment by performing the following operations:

Install Go 1.7 or later. You can visit the official website of Go to download an appropriate version.

  1. Run the go get or glide command to install Alibaba Cloud SDK for Go.
    • Run the go get command to install the Alibaba Cloud SDK for Go.
      go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
      Note
      • No messages appear during the installation. The installation process requires a few minutes to complete. If the installation times out, run the command again.
      • If the src/github.com/aliyun/alibaba-cloud-sdk-go/services/vod subfolder appears in the folder that is specified by the GOPATH variable, the SDK is installed.
    • Run the glide command to install the Alibaba Cloud SDK for Go.
      glide get github.com/aliyun/alibaba-cloud-sdk-go
  2. Install the OSS SDK. For more information, see Installation.
Step 3: Upload media files
 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) {
    // Specify the storage region of ApsaraVideo VOD.
    regionId := "cn-shanghai"
    // Create an object for authorization.
    credential := &credentials.AccessKeyCredential{
        accessKeyId,
        accessKeySecret,
    }
    // The custom configuration parameters.
    config := sdk.NewConfig()
    config.AutoRetry = true     // Specifies whether to automatically reconnect to the network if a connection fails.
    config.MaxRetryTime = 3     // The maximum number of retry attempts.
    config.Timeout = 3000000000 // The connection timeout period. Unit: nanoseconds. Default value: 3000000000.
    // Create a vodClient instance.
    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"
    // Sample URL of the video thumbnail: example: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) {
    // Obtain a storage location. 
    bucket, err := client.Bucket(uploadAddressDTO.Bucket)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    // Upload a local file. 
    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>"                    // Your AccessKey ID.
    var accessKeySecret string = "<Your AccessKeySecret>" // Your AccessKey secret.
    var localFile string = "/opt/video/sample/video_file.mp4"     // The full path of the local video file to be uploaded to ApsaraVideo VOD.
    // Initialize an ApsaraVideo VOD client and obtain an upload URL and an upload credential.
    var vodClient, initVodClientErr = InitVodClient(accessKeyId, accessKeySecret)
    if initVodClientErr != nil {
        fmt.Println("Error:", initVodClientErr)
        return
    }
    // Obtain an upload URL and an upload credential.
    var response, createUploadVideoErr = MyCreateUploadVideo(vodClient)
    if createUploadVideoErr != nil {
        fmt.Println("Error:", createUploadVideoErr)
        return
    }
    // If the preceding code is successfully executed, the videoId, uploadAddress, and uploadAuth parameters are returned.
    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)
    // Use the obtained upload URL and upload credential to initialize an OSS client.
    var ossClient, _ = InitOssClient(uploadAuthDTO, uploadAddressDTO)
    // Upload a video file. Take note that multiple parts are uploaded in parallel. The system starts to upload the next file only when all parts of the current file have been uploaded. The consumed time depends on the file size and upstream bandwidth.
    UploadLocalFile(ossClient, uploadAddressDTO, localFile)
    //MultipartUploadFile(ossClient, uploadAddressDTO, localFile)
    fmt.Println("Succeed, VideoId:", videoId)
}
                

Procedure and sample code of using the OSS SDK for Java

Important Prepare the environment by performing the following operations:
  • Install Java 1.8 or later.
  • To check the Java version, run the java -version command on the CLI.

Step 1: Install the server operation SDK of ApsaraVideo VOD

For more information, see Installation.

Step 2: Install the OSS SDK

For more information, see Installation.

Step 3. Upload media files
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 {
        // Specify the storage region of ApsaraVideo VOD. Example: cn-shanghai. For more information about other storage regions, see Media asset storage. 
        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");
        // Sample URL of the video thumbnail: http://example.aliyundoc.com/test_cover_****.jpg.
        //request.setCoverURL("<your CoverURL>");
        //request.setCateId(-1L);
        //request.setTemplateGroupId("");
        //request.setWorkflowId("");
        //request.setStorageLocation("");
        //request.setAppId("app-1000000");
        // Set the request timeout period.
        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) {
        // Your AccessKey ID.
        String accessKeyId = "<Your AccessKeyId>";
        // Your AccessKey secret.
        String accessKeySecret = "<Your AccessKeySecret>";
        // The full path of the local video file to be uploaded to ApsaraVideo VOD. The path must contain a file name extension.
        String localFile = "/Users/yours/Video/testVideo.flv";
        try {
            // Initialize an ApsaraVideo VOD client and obtain an upload URL and an upload credential.
            DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);
            CreateUploadVideoResponse createUploadVideoResponse = createUploadVideo(vodClient);
            // If the preceding code is successfully executed, the videoId, uploadAddress, and uploadAuth parameters are returned.
            String videoId = createUploadVideoResponse.getVideoId();

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

            // Use the obtained upload URL and upload credential to initialize an OSS client.
            OSSClient ossClient = initOssClient(uploadAuth, uploadAddress);
            // Upload a video file. Take note that multiple parts are uploaded in parallel. The system starts to upload the next file only when all parts of the current file have been uploaded. The consumed time depends on the file size and upstream bandwidth.
            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));
    }
}
                

Procedure and sample code of using the OSS SDK for .NET

Important Prepare the environment by performing the following operations:
  • Install .NET Framework 4.6.1 or later.
  • Install .NET Standard 2.0 or later.

Step 1: Install the server operation SDK of ApsaraVideo VOD

For more information, see Installation.

Step 2: Install the OSS SDK

For more information, see Installation.

Step 3: Initialize an ApsaraVideo VOD client

Sample code
public static DefaultAcsClient InitVodClient(string accessKeyId, string accessKeySecret)
{
    // Specify the storage region of ApsaraVideo VOD. Example: cn-shanghai.
    string regionId = "cn-shanghai";
    IClientProfile profile = DefaultProfile.GetProfile(regionId, accessKeyId, accessKeySecret);
    return new DefaultAcsClient(profile);
}

Step 4: Upload media files

  1. Obtain an upload URL and an upload credential. In this example, a video file is uploaded.
    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 = "<File description>";
        // request. Tags = "<Tags of the video. Separate multiple video tags with commas (,).>";
        // Sample URL of the video thumbnail: http://example.aliyundoc.com/test_cover_****.jpg.
        // request. CoverURL = "<Video thumbnail>";
        // The category ID. Log on to the ApsaraVideo VOD console to query the category ID.
        //request.CateId = -1;
        // The ID of the transcoding template group. Log on to the ApsaraVideo VOD console to query the ID of the transcoding template group.
        // request. TemplateGroupId = "<Transcoding template group ID>";
        // The ID of the workflow. Log on to the ApsaraVideo VOD console to query the ID of the workflow.
        // request. WorkflowId = "<Workflow ID>";
        // The storage location of the video file. Log on to the ApsaraVideo VOD console to query the storage location.
        // request. StorageLocation = "<Storage location>";
        // The value of the AppId parameter is fixed. 
        //request.AppId = "app-1000000";
        // Set the request timeout period.
        request.SetReadTimeoutInMilliSeconds(1000);
        request.SetConnectTimeoutInMilliSeconds(1000);
        return vodClient.GetAcsResponse(request);
    }
  2. Decode the Base64-encoded upload URL and upload credential in the Base64 format.
  3. Use the upload URL and upload credential to initialize an OSS client.
    Important
    • Before you use the upload URL and upload credential, decode them in the Base64 format and then in the JSON format.
    • You must use an STS token to initialize the OSS client.
    Sample code
    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. Upload a local file.
    Sample code
    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. Optional. If the upload credential expires, refresh the upload credential and upload the media file again.
    Sample code
    public static RefreshUploadVideoResponse RefreshUploadVideo(DefaultAcsClient vodClient)
    {
        RefreshUploadVideoRequest request = new RefreshUploadVideoRequest();
        request.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON;
        request.VideoId = "VideoId";
        // Set the request timeout period.
        request.SetReadTimeoutInMilliSeconds(1000);
        request.SetConnectTimeoutInMilliSeconds(1000);
        return vodClient.GetAcsResponse(request);
    }
  6. Perform the steps of the entire process. Capture exceptions during the execution.
    Sample code
    // Your AccessKey ID.
    string accessKeyId = "<Your AccessKeyId>"; 
    // Your AccessKey secret.
    string accessKeySecret = "<Your AccessKeySecret>";
    // The full path of the local video file to be uploaded to ApsaraVideo VOD. The path must contain a file name extension.
    string localFile = "/Users/yours/Video/testVideo.flv";
    try {
        // Initialize an ApsaraVideo VOD client and obtain an upload URL and an upload credential.
        DefaultAcsClient vodClient = InitVodClient(accessKeyId, accessKeySecret);
        CreateUploadVideoResponse createUploadVideoResponse = CreateUploadVideo(vodClient);
        // If the preceding code is successfully executed, the videoId, uploadAddress, and uploadAuth parameters are returned.
        String videoId = createUploadVideoResponse.VideoId;
        JObject uploadAuth = JObject.Parse(Base64Decode(createUploadVideoResponse.UploadAuth));
        JObject uploadAddress = JObject.Parse(Base64Decode(createUploadVideoResponse.UploadAddress));
        // Use the obtained upload URL and upload credential to initialize an OSS client.
        OssClient ossClient = InitOssClient(uploadAuth, uploadAddress);
        // Upload a video file. Take note that multiple parts are uploaded in parallel. The system starts to upload the next file only when all parts of the current file have been uploaded. The consumed time depends on the file size and upstream bandwidth.
        UploadLocalFile(ossClient, uploadAddress, localFile);
        Console.WriteLine("Put local file succeed, VideoId : " + videoId);
    } 
    catch (Exception e) 
    {
        Console.WriteLine("Put local file fail, ErrorMessage : " + e.Message);
    }

References for other programming languages

If the upload SDKs for the preceding programming languages and the sample code cannot meet your business requirements, check the following table for references for more programming languages.
Note For more information about the upload SDKs provided by ApsaraVideo VOD, see the related topics. To learn how to upload media files by using OSS SDKs for PHP, Java, Go, and .NET, see the sample code in this topic.
Programming language ApsaraVideo VOD server operation SDK OSS SDK
Node.js
  1. Installation
  2. Initialization
  3. Media upload
  1. Installation
  2. Initialization
  3. Upload objects

Notes for decoding upload URLs and credentials

You can parse the values of the uploadAddress and uploadAuth parameters returned by ApsaraVideo VOD to obtain upload URLs and credentials. You can use the parsed upload URLs and credentials to initialize OSS clients.
Note Base64 decoding is a common task for developers. Therefore, no specific tools are described in this topic. This section describes the fields decoded from the uploadAddress and uploadAuth parameters.
Table 1. Fields decoded from the uploadAddress parameter
Field Description
Bucket The storage location of ApsaraVideo VOD.
Endpoint The ID of the storage region of ApsaraVideo VOD.
FileName The name assigned by ApsaraVideo VOD to the media file to be uploaded.
ObjectPrefix The field that is returned only for an M3U8 file.
Table 2. Fields decoded from the uploadAuth parameter
Field Description
AccessKeyId The AccessKey ID of the account that is used to upload the media file.
AccessKeySecret The AccessKey secret of the account that is used to upload the media file.
SecurityToken The security token of the upload credential.
ExpireUTCTime The time when the upload URL and upload credential expire. The time follows the ISO 8601 standard in the yyyy-MM-ddTHH:mm:ssZ format. The time is displayed in UTC.
Expiration The expiration time of the upload credential. The validity period of an upload credential is 3,000 seconds. You must refresh the upload credential after it expires.
Region The ID of the storage region.

The following code shows the sample upload URLs and credentials before and after decoding.

Sample uploadAddress and uploadAuth parameters before decoding
{
"VideoId": "1c1255e7e58d4d7487d0c1852954****",
"UploadAddress": "eyJFbmRwb2ludCI6Imh0dHBzOi8vb3NzLWNuLXNoYW5naGFpLmFsaXl1bmNzLmNvbSIsIkJ1Y2tldCI6InZvZC1zaGFuZ2hhaS1rYXNpIiwiRmlsZU5hbWUiOiJ2b2QtZjFlOGM0L3N2LzFhYmUyZDVjLTE3ZWU3Zjc3ZjA0LzFhYmUyZDVjLTE3ZWU3Zjc3ZjA0Lm1w****",
"RequestId": "2975D91A-F89F-5EBF-97D5-07028C90****",
"UploadAuth": "eyJTZWN1cml0eVRva2VuIjoiQ0FJUzhRUjFxNkZ0NUIyeWZTaklyNWZNQ3Z6NWg1aFEzWVc2VVhmVDEwNFpXUGtVaHE3Z3B6ejJJSGhFZjNWdEErOGN0LzQxbFdsVzUvWWFscklxRk1NVkhSMlVNWkFvdjgwT3ExLzdKb0hidk5ldTBic0hoWnY5OEtzbG9waThqcUhvZU96Y1lJNzN2cHpQQWdtMldFUVJySkwrY1RLOUpaZlBVL21nZ29KbWFkSTZSeFN4YVNFOGF2NWRPZ3BscnIzNFh4bTBNdTIyWUNiM25rM2FEa2RqcG1nYWpuaGt1NXk0MmRHNzRCalRoMEdZc3VnT3ZOYllPb0NwYWNWTE5wVnlXTXZYdXV0dGJmamgzU2RjekJKSStheHE3dFZENGl5VmtkeUJKRk5UN2g2YUZ1ZkkrNzhjS3hSaU5JazhHckpGcGVUeHNPQjhwdTNMbnA3cjlnNUpPdWhaTVYvWVg1dnk1ZGJBQk9LeFA4d2xTSzcvUEgzQnNMYUlMWUtuamhzZ1puc1hEQXBRWjdoYkxXUnJXeUUwVGpiVEpwZXU0a3poWlIreUtkdUN5N3BrK3AxdzExSGw0ZGV2T2x5VFFxMlF5em9sSXBzN1prOUtSeGtOeGo3SWVLZ2NieWxSZDA5bUg3K1BVYmhyYUJkWHBjR1l1aGJKQkFsaDFXMXlvdm5pWnV2Zm9Md2ljWUg0VjU1ZHMrOGFmNDhVbDJveFUyeitVYTYxOEZoMkVsWm9XckZMeXFMZ0ZJYWk0YnVldW9XcGJQWEJGK29NdHlkcEV3SFlwREhmVG1oTGYyK2pwSTg5YmxiZDRNVFl5cVBNK3BJbEV3STE1NWRCQ2czQWY0OWcvMWM2cExDc3FFMmErdUs1WGkyaHV6Tm45OVNIOGRZUTV4TTRPYTZ0aWVMSXNtUFYrU1hQYktSbWxwaUlWalV6QnhHdkoxNEJtYS9PMWlwVzkweGF5ekR0WWt4RHNXNzhqempnSUpjcHRkV1EzVzVCRDZ0cG51RFZkaXl0NUcwSUM2alN1K1pRQmI0NEk3b1hDS3p0aEY4NGxxWDkwelMwdXB6Y3R5bENTOEw1ZWJJN1o1SnlCQmIrOEJzNXppV3FXRGtKR29BQmg1Z3M3YlVOZEs2NGdVaThRM2tOdWpVZFdiZTFTb1Y1cVZJOEdmTkYvZ1g0MUNvWGlrSHhwN3FwOTBpMFBSd1h5VUc4WEVkVGUxY3RZbGEwZG9WeGhtNThOQVdoR0pEOXQxK21iWjd4ZUFkczNqT3NpSUNPb25Ib3JWYmNUb0s2VGs3cjNxejZHSlgybE54djVmWTBvUWZsSTJNQWR0cHo5WnJidnZ5eUFjYz0iLCJBY2Nlc3NLZXlJZCI6IlNUUy5OVHlBRk1qR3FqR1FTUWIzTkxUdjhpa0tFIiwiRXhwaXJlVVRDVGltZSI6IjIwMjItMDItMTFUMDk6NTc6NDNaIiwiQWNjZXNzS2V5U2VjcmV0IjoiOWZGUXQyeVJSWTZGMVBFb0hNS1dMYmFmeHlSd1BNNjFuRUhDbzZDTWlQZCIsIkV4cGlyYXRpb24iOiIzNjAwIiwiUmVnaW9uIjoiY24tc2hhbmdoYWk****"
}
Sample UploadAddress parameter after decoding
{
"Endpoint": "https://******.aliyuncs.com",
"Bucket": "vod-shanghai-****",
"FileName": "vod-f1e8c4/sv/1abe2d5c-17ee7f77f04/1abe2d5c-17ee7f7****.mp4"
}
Important If an M3U8 file is uploaded, the ObjectPrefix field is decoded from the UploadAddress parameter, as shown in the following example.
Sample UploadAddress parameter after decoding for an M3U8 file
{
"Endpoint": "https://******.aliyuncs.com",
"Bucket": "vod-shanghai-****",
"ObjectPrefix": "vod-f1e8c4/sv/4b9c68b2-17ee8156****",
"FileName": "vod-f1e8c4/sv/4b9c68b2-17ee81564e7/4b9c68b2-17ee815****.m3u8"
}
Sample uploadAuth parameter after decoding
{
"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"
}