全部產品
Search
文件中心

ApsaraVideo VOD:使用PHP SDK上傳檔案

更新時間:Aug 27, 2026

本文通過樣本詳細介紹如何使用服務端上傳SDK(PHP語言)將各類媒體檔案上傳至點播儲存。

整體說明

說明

建議在PHP中構建BS(Browser/Server)架構進行開發。

從內部邏輯角度看,PHP上傳SDK遵循點播服務端SDK的通用流程。詳情請參見上傳流程。從操作角度看,使用PHP上傳SDK的基礎流程如下:

  1. 完成前提條件。請參見前提條件

  2. 整合PHP上傳SDK。請參見整合PHP上傳SDK

  3. 實現上傳邏輯(主要是上傳資訊配置)。

  4. PHP上傳SDK預設服務存取點為cn-shanghai(上海), 若需要上傳媒體檔案到其他地區,可以通過AliyunVodUploader在初始化時指定地區,點播支援的服務存取點,請參見服務存取點

    以指定上傳地區為cn-beijing(北京)為例,配置樣本如下:

    $apiRegionId = 'cn-beijing';  //上傳目的地區域region
    $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret, $apiRegionId);

前提條件

  • 您已經開通了ApsaraVideo for VOD服務。開通步驟請參見開通ApsaraVideo for VOD服務

  • 您已經完成上傳相關的系統配置,包括啟用目標儲存地區的儲存地址和配置回調。操作指引請參見管理儲存Bucket回調設定

  • 您已準備好用於調用點播服務的帳號。為避免阿里雲帳號AccessKey泄露帶來的安全風險,推薦您建立RAM使用者並授予其VOD相關許可權。然後使用RAM使用者的AK對(AccessKey ID和AccessKey Secret)訪問點播服務。操作指引請參見建立RAM使用者並授權

  • 已配置環境變數ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET。具體操作,請參見在Linux、macOS和Windows系統配置環境變數

    重要
    • 阿里雲帳號的AccessKey擁有所有API的存取權限,建議您使用RAM使用者的AccessKey進行API訪問或日常營運。

    • 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。

  • (可選)如需使用STS臨時授權方式(阿里雲Security Token Service)訪問點播服務,請為RAM使用者建立角色並授予角色VOD相關許可權。操作指引請參見擷取STS Token

整合PHP上傳SDK

  1. 下載 SDK及demo樣本。

  2. 解壓VodUploadSDK-PHP_1.0.3.zip,將VodUploadSDK-PHP_1.0.3目錄下的voduploadsdk複製到您的專案中。

PHP上傳SDK目錄說明

/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/voduploadsdk/uploader

  • UploadVideoRequest.php

    目錄

    說明

    UploadVideoRequest

    上傳視頻的請求類,欄位請參見擷取音視頻上傳地址和憑證

  • UploadImageRequest.php

    目錄

    說明

    UploadImageRequest

    上傳圖片的請求類,欄位請參見擷取圖片上傳地址和憑證

  • UploadAttachedMediaRequest.php

    目錄

    說明

    UploadAttachedMediaRequest

    上傳輔助媒資的請求類,欄位請參見擷取輔助媒資上傳地址和憑證

  • AliyunVodUploader.php

    目錄

    說明

    __construct

    可設定上傳的AccessKey以及ApsaraVideo for VOD中心和訪問網域名稱。請參見AccessKey點播地區標識

    uploadLocalVideo

    上傳本地視頻的介面。

    uploadWebVideo

    上傳網路視頻的介面。

    uploadLocalImage

    上傳本地圖片。

    uploadWebImage

    上傳網狀圖片。

    uploadLocalAttachedMedia

    上傳本地輔助媒資檔案。

    uploadWebAttachedMedia

    上傳網路輔助媒資檔案。

    uploadLocalM3u8

    上傳本地m3u8檔案。

    uploadWebM3u8

    上傳網路m3u8檔案。

    parseM3u8File

    解析m3u8索引檔案得到分區地址清單。

    setEcsRegionId

    設定上傳指令碼部署的ECS地區(如果有),如果與ApsaraVideo for VOD儲存同一地區會自動啟用內網上傳。

    setEnableSSL

    是否啟用SSL(網路請求使用HTTPS),預設不啟用,以避免相關擴充未安裝或配置異常時無法使用。

    uploadProgressCallback

    上傳進度回呼函數,可重寫。詳見下方方法簽名與重寫樣本。

    uploadProgressCallback 方法簽名

    public function uploadProgressCallback($mediaId, $consumedBytes, $totalBytes)
    • $mediaId:媒體 ID。

    • $consumedBytes:已上傳的位元組數。

    • $totalBytes:檔案總位元組數。

    上傳進度百分比的計算方式為:100 * ($consumedBytes / $totalBytes)。計算前請判斷 $totalBytes 是否為 0,避免除零錯誤。

    繼承 AliyunVodUploader 並重寫該方法,可以實現自訂的上傳進度展示,樣本如下:

    class MyAliyunVodUploader extends AliyunVodUploader {
        public function uploadProgressCallback($mediaId, $consumedBytes, $totalBytes) {
            if ($totalBytes > 0) {
                $rate = 100 * (floatval($consumedBytes) / floatval($totalBytes));
            } else {
                $rate = 0;
            }
            echo round($rate, 1) . "%
    ";
            flush();
        }
    }
  • AliyunVodUtils.php

    目錄

    說明

    AliyunVodUtils

    工具類,提供截取字串、擷取副檔名、擷取檔案名稱等靜態函數。

    AliyunVodLog

    實現簡單列印的日誌類,logSwitch為日誌開關。

    AliyunVodDownloader

    實現下載網路檔案。

    AliyunVodReportUpload

    實現上傳進度彙報。

    AliyunVodError

    定義錯誤碼。

/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/voduploadsdk

  • aliyun-php-sdk-core:上傳SDK依賴的基礎類,封裝了阿里雲API簽名和HTTP請求等。

  • aliyun-php-sdk-vod:ApsaraVideo for VOD的服務端介面SDK,封裝了ApsaraVideo for VODAPI的請求。

  • aliyun-php-sdk-oss:上傳SDK依賴的OSS類,封裝了OSS上傳等操作。

/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/samples

  • uploadVideo.php:上傳視頻的範例程式碼。

  • uploadImage.php:上傳圖片的範例程式碼。

  • uploadAttachedMedia.php:上傳輔助媒資的範例程式碼。

情境一:上傳音視頻

普通音視頻

音視頻上傳目前支援以下類型檔案上傳:

  • 上傳本地檔案,使用分區上傳,最大支援48.8 TB的單個檔案,不支援斷點續傳。請參見testUploadLocalVideo函數。

  • 上傳網路檔案,可指定檔案URL進行上傳,最大支援48.8 TB的單個檔案。該上傳方式需要先將網路檔案下載到本地磁碟,再進行上傳,所以要保證本地磁碟有充足的空間。請參見testUploadWebVideo函數。

展開查看範例程式碼

<?php
/**
 * Created by Aliyun ApsaraVideo VOD.
 */
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
//測試上傳本地視頻
function testUploadLocalVideo($accessKeyId, $accessKeySecret, $filePath)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadVideoRequest = new UploadVideoRequest($filePath, 'testUploadLocalVideo via PHP-SDK');
        // CateId為媒資分類ID,可通過點播控制台**組態管理**>**媒資管理配置**>**分類管理**頁面查看,或通過AddCategory介面建立。詳情請參見[管理媒資分類](https://www.alibabacloud.com/help/zh/vod/user-guide/manage-video-categories)。
        $uploadVideoRequest->setCateId(<您的分類ID>);
        //CoverURL樣本:http://example.com/example****.jpg
        //$uploadVideoRequest->setCoverURL("<your CoverURL>");
        //$uploadVideoRequest->setTags('test1,test2');
        //$uploadVideoRequest->setStorageLocation('outin-xx.oss-cn-beijing.aliyuncs.com');
        $uploadVideoRequest->setTemplateGroupId('your-template-group-id');
        $userData = array(
            //Callback樣本:https://demo.aliyundoc.com/ProcessMessageCallback
            "MessageCallback"=>array("CallbackURL"=>"<your callback URL>"),
            "Extend"=>array("localId"=>"xxx", "test"=>"www")
        );
        $uploadVideoRequest->setUserData(json_encode($userData));
        $res = $uploader->uploadLocalVideo($uploadVideoRequest);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadLocalVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
            $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
    }
}
// 測試上傳網路視頻
function testUploadWebVideo($accessKeyId, $accessKeySecret, $fileURL)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadVideoRequest = new UploadVideoRequest($fileURL, 'testUploadWebVideo via PHP-SDK');
        $res = $uploader->uploadWebVideo($uploadVideoRequest);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadWebVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
            $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
    }
}

####  執行測試代碼   ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$localFilePath = '/opt/video/sample.mp4';
// testUploadLocalVideo($accessKeyId, $accessKeySecret, $localFilePath);

// webFileURL樣本:http://example-bucket-****.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc****/daa30814c0c340cf8199926f78aa****-a0bc05ba62c3e95cc672e88b8281****-ld.mp4?auth_key=1608774986-0-0-c56acd302bea0c331370d8ed6865****
$webFileURL = '<your webFileURL>';
testUploadWebVideo($accessKeyId, $accessKeySecret, $webFileURL);

uploadLocalVideo支援通過setTemplateGroupId()在上傳時指定轉碼模板組ID。指定後視頻上傳完成即自動轉碼,無需調用SubmitTranscodeJobs介面。轉碼模板組ID可在VOD控制台 > 組態管理 > ApsaraVideo for Media Processing配置 > 轉碼模板組頁面查看。

M3U8視頻檔案

部分程式碼範例如下所示:

展開查看範例程式碼

<?php
/**
 * Created by Aliyun ApsaraVideo VOD.
 */
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 測試上傳本地m3u8視頻
function testUploadLocalM3u8($accessKeyId, $accessKeySecret, $m3u8FilePath)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadVideoRequest = new UploadVideoRequest($m3u8FilePath, 'testUploadLocalM3u8 via PHP-SDK');
        // 調用介面解析m3u8的分區地址清單,如果解析結果不準確,請自行拼接地址清單(預設分區檔案和m3u8檔案位於同一目錄)
        $sliceFiles = $uploader->parseM3u8File($m3u8FilePath);
        //print_r($sliceFiles);
        $res = $uploader->uploadLocalM3u8($uploadVideoRequest, $sliceFiles);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadLocalM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
            $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
    }
}

// 測試上傳網路m3u8視頻
function testUploadWebM3u8($accessKeyId, $accessKeySecret, $m3u8FileUrl)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadVideoRequest = new UploadVideoRequest($m3u8FileUrl, 'testUploadWebM3u8 via PHP-SDK');
        // 調用介面解析m3u8的分區地址清單,如果解析結果不準確,請自行拼接地址清單(預設分區檔案和m3u8檔案位於同一目錄)
        $sliceFileUrls = $uploader->parseM3u8File($m3u8FileUrl);
        //print_r($sliceFileUrls);
        $res = $uploader->uploadWebM3u8($uploadVideoRequest, $sliceFileUrls);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadWebM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
            $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
    }
}
####  執行測試代碼   ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$localM3u8FilePath = '/opt/video/m3u8/sample.m3u8';
//testUploadLocalM3u8($accessKeyId, $accessKeySecret, $localM3u8FilePath);

//webM3u8FileURL樣本:http://example-bucket-****.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc****/daa30814c0c340cf8199926f78aa****-195a25af366b5edae324c47e99a0****-ld.m3u8?auth_key=1608775606-0-0-9fb038deaecd009dadd86721c585****
$webM3u8FileURL = '<your webM3u8FileURL>';
//testUploadWebM3u8($accessKeyId, $accessKeySecret, $webM3u8FileURL);

上傳加速

當您需要上傳較大檔案(GB、TB層級)或進行跨地區上傳(比如在中國內地將視頻上傳到新加坡儲存地區的儲存地址)時,您可以啟用上傳加速功能。詳情請參見媒體上傳概述。開通後需要您在上傳配置中的UserData對象(若沒有需要建立)增加相應的key-valueAccelerateConfig。樣本如下:

$userData = array(  
    "AccelerateConfig"=>array("Type"=>"oss","Domain"=>"****Bucket.oss-accelerate.aliyuncs.com"),
);       
$uploadVideoRequest->setUserData(json_encode($userData));

參數描述

名稱

類型

說明

Type

string

開啟上傳加速的類型(僅支援oss)。

Domain

string

使用者bucket的加速地址(預設為https)。

說明

使用開通後分配的一個加速地址,例如:vod-*******.oss-accelerate.aliyuncs.com。

批量上傳多視頻

uploadLocalVideouploadWebVideo 每次調用僅支援上傳單個視頻檔案,不支援單次批量上傳多個視頻。如果需要上傳多個視頻,可以調用 UploadMediaByUrl 介面批量上傳。

UploadMediaByUrl 適用於待上傳檔案已具備公網訪問地址的情境,一次調用即可提交多個媒體 URL。若上傳的是本地檔案,則需在 PHP 側迴圈調用 uploadLocalVideo,為每個檔案單獨建立 UploadVideoRequest 對象,並對每次調用做異常捕獲,避免單個檔案上傳失敗中斷整批上傳。

上傳網路視頻時同理,將迴圈體內的 UploadVideoRequest 替換為網路視頻對應的請求對象並調用 uploadWebVideo 即可。

控制台上傳頁面批量上傳視頻時,系統同樣是逐個處理每個檔案。若檔案較大或需要批量上傳,建議使用 PC 用戶端工具。

情境二:上傳圖片

展開查看範例程式碼

展開查看範例程式碼

<?php
/**
 * Created by Aliyun ApsaraVideo VoD.
 * User: https://www.aliyun.com/product/vod
 */

require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';

date_default_timezone_set('PRC');

// 測試上傳本地圖片
function testUploadLocalImage($accessKeyId, $accessKeySecret, $filePath)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadImageRequest = new UploadImageRequest($filePath, 'testUploadLocalImage via PHP-SDK');
        $uploadImageRequest->setCateId(1000009458);
        $res = $uploader->uploadLocalImage($uploadImageRequest);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadLocalImage Failed, ErrorMessage: %s\n", $e->getMessage());
    }

}

// 測試上傳網狀圖片
function testUploadWebImage($accessKeyId, $accessKeySecret, $fileURL)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadImageRequest = new UploadImageRequest($fileURL, 'testUploadWebImage via PHP-SDK');
        $uploadImageRequest->setCateId(1000009458);
        $res = $uploader->uploadWebImage($uploadImageRequest);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadWebImage Failed, ErrorMessage: %s\n", $e->getMessage());
    }

}



####  執行測試代碼   ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');

$localFilePath = '/opt/image/test-image.jpg';
//testUploadLocalImage($accessKeyId, $accessKeySecret, $localFilePath);

$webFileURL = 'http://vod-download.cn-shanghai.aliyuncs.com/retina/pic/20180208/496AE240-54AE-4CC8-8578-3EEC8F38****.gif';
testUploadWebImage($accessKeyId, $accessKeySecret, $webFileURL);

情境三:上傳輔助媒資檔案

部分程式碼範例如下所示:

展開查看範例程式碼

展開查看範例程式碼

<?php
/**
 * Created by Aliyun ApsaraVideo VoD.
 * User: https://www.aliyun.com/product/vod
 */

require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';

date_default_timezone_set('PRC');

// 測試上傳本地輔助媒資檔案
function testUploadLocalAttachedMedia($accessKeyId, $accessKeySecret, $filePath)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadAttachedRequest = new UploadAttachedMediaRequest($filePath, 'watermark',
            'testUploadLocalAttachedMedia via PHP-SDK');
        //$uploadAttachedRequest->setCateId(100000****);
        $res = $uploader->uploadLocalAttachedMedia($uploadAttachedRequest);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadLocalAttachedMedia Failed, ErrorMessage: %s\n", $e->getMessage());
    }

}

// 測試上傳網路輔助媒資檔案
function testUploadWebAttachedMedia($accessKeyId, $accessKeySecret, $fileURL)
{
    try {
        $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
        $uploadAttachedRequest = new UploadAttachedMediaRequest($fileURL, 'watermark',
            'testUploadWebAttachedMedia via PHP-SDK');
        //$uploadAttachedRequest->setCateId(100000****);
        $res = $uploader->uploadWebAttachedMedia($uploadAttachedRequest);
        print_r($res);
    } catch (Exception $e) {
        printf("testUploadWebAttachedMedia Failed, ErrorMessage: %s\n", $e->getMessage());
    }

}


####  執行測試代碼   ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');

$localFilePath = '/opt/image/test.png';
//testUploadLocalAttachedMedia($accessKeyId, $accessKeySecret, $localFilePath);

$webFileURL = 'http://vod-download.cn-shanghai.aliyuncs.com/retina/pic/20180208/496AE240-54AE-4CC8-8578-3EEC8F38****.gif';
testUploadWebAttachedMedia($accessKeyId, $accessKeySecret, $webFileURL);

相關文檔

媒體上傳概述

STS SDK概覽