使用PHP SDK上傳文件
本文通過(guò)示例詳細(xì)介紹如何使用服務(wù)端上傳SDK(PHP語(yǔ)言)將各類(lèi)媒體文件上傳至點(diǎn)播存儲(chǔ)。
整體說(shuō)明
建議在PHP中構(gòu)建BS(Browser/Server)架構(gòu)進(jìn)行開(kāi)發(fā)。
從內(nèi)部邏輯角度看,PHP上傳SDK遵循點(diǎn)播服務(wù)端SDK的通用流程。詳情請(qǐng)參見(jiàn)上傳流程。從操作角度看,使用PHP上傳SDK的基礎(chǔ)流程如下:
完成前提條件。請(qǐng)參見(jiàn)前提條件。
集成PHP上傳SDK。請(qǐng)參見(jiàn)集成PHP上傳SDK。
實(shí)現(xiàn)上傳邏輯(主要是上傳信息配置)。
音視頻上傳請(qǐng)參見(jiàn)場(chǎng)景一:上傳音視頻。
圖片上傳請(qǐng)參見(jiàn)場(chǎng)景二:上傳圖片。
輔助媒資上傳請(qǐng)參見(jiàn)場(chǎng)景三:上傳輔助媒資文件。
PHP上傳SDK默認(rèn)服務(wù)接入點(diǎn)為
cn-shanghai
(上海), 若需要上傳媒體文件到其他區(qū)域,可以通過(guò)AliyunVodUploader
在初始化時(shí)指定區(qū)域,點(diǎn)播支持的服務(wù)接入點(diǎn),請(qǐng)參見(jiàn)服務(wù)接入點(diǎn)。以指定上傳區(qū)域?yàn)?code data-tag="code" code-type="xCode" class="code">cn-beijing(北京)為例,配置示例如下:
$apiRegionId = 'cn-beijing'; //上傳目標(biāo)區(qū)域region $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret, $apiRegionId);
前提條件
您已經(jīng)開(kāi)通了視頻點(diǎn)播服務(wù)。開(kāi)通步驟請(qǐng)參見(jiàn)開(kāi)通視頻點(diǎn)播服務(wù)。
您已經(jīng)完成上傳相關(guān)的系統(tǒng)配置,包括啟用目標(biāo)存儲(chǔ)地域的存儲(chǔ)地址和配置回調(diào)。操作指引請(qǐng)參見(jiàn)管理存儲(chǔ)Bucket及回調(diào)設(shè)置。
您已準(zhǔn)備好用于調(diào)用點(diǎn)播服務(wù)的賬號(hào)。為避免阿里云賬號(hào)AccessKey泄露帶來(lái)的安全風(fēng)險(xiǎn),推薦您創(chuàng)建RAM用戶(hù)并授予其VOD相關(guān)權(quán)限。然后使用RAM用戶(hù)的AK對(duì)(AccessKey ID和AccessKey Secret)訪問(wèn)點(diǎn)播服務(wù)。操作指引請(qǐng)參見(jiàn)創(chuàng)建RAM用戶(hù)并授權(quán)。
已配置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具體操作,請(qǐng)參見(jiàn)在Linux、macOS和Windows系統(tǒng)配置環(huán)境變量。
重要阿里云賬號(hào)的AccessKey擁有所有API的訪問(wèn)權(quán)限,建議您使用RAM用戶(hù)的AccessKey進(jìn)行API訪問(wèn)或日常運(yùn)維。
強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
(可選)如需使用STS臨時(shí)授權(quán)方式(阿里云Security Token Service)訪問(wèn)點(diǎn)播服務(wù),請(qǐng)為RAM用戶(hù)創(chuàng)建角色并授予角色VOD相關(guān)權(quán)限。操作指引請(qǐng)參見(jiàn)使用STS臨時(shí)授權(quán)方案上傳視頻。
說(shuō)明STS臨時(shí)授權(quán)方式的適用場(chǎng)景請(qǐng)參見(jiàn)憑證方式與STS方式對(duì)比。
集成PHP上傳SDK
下載PHP上傳SDK及示例代碼VodUploadSDK-PHP_1.0.3.zip,請(qǐng)參見(jiàn)上傳SDK。
說(shuō)明此處以SDK1.0.3版本舉例說(shuō)明。其他版本請(qǐng)根據(jù)實(shí)際情況操作。
SDK及示例代碼解壓后的詳細(xì)目錄說(shuō)明,請(qǐng)參見(jiàn)下文目錄說(shuō)明。
解壓VodUploadSDK-PHP_1.0.3.zip,將VodUploadSDK-PHP_1.0.3目錄下的voduploadsdk復(fù)制到您的項(xiàng)目中。
更新PHP上傳SDK
若發(fā)現(xiàn)新的接口或已有接口新的功能在當(dāng)前SDK沒(méi)有,請(qǐng)下載最新的PHP上傳SDK覆蓋到本地SDK文件。更多信息,請(qǐng)參見(jiàn)上傳SDK。
您可以打開(kāi)voduploadsdk目錄下的ChangeLog.txt文件查看當(dāng)前SDK的版本號(hào)和發(fā)布日期。
PHP上傳SDK目錄說(shuō)明
/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/voduploadsdk/uploader
UploadVideoRequest.php
目錄
說(shuō)明
UploadVideoRequest
上傳視頻的請(qǐng)求類(lèi),字段請(qǐng)參見(jiàn)獲取音視頻上傳地址和憑證。
UploadImageRequest.php
目錄
說(shuō)明
UploadImageRequest
上傳圖片的請(qǐng)求類(lèi),字段請(qǐng)參見(jiàn)獲取圖片上傳地址和憑證。
UploadAttachedMediaRequest.php
目錄
說(shuō)明
UploadAttachedMediaRequest
上傳輔助媒資的請(qǐng)求類(lèi),字段請(qǐng)參見(jiàn)獲取輔助媒資上傳地址和憑證。
AliyunVodUploader.php
目錄
說(shuō)明
__construct
可設(shè)置上傳的AccessKey以及視頻點(diǎn)播中心和訪問(wèn)域名。請(qǐng)參見(jiàn)AccessKey和點(diǎn)播地域標(biāo)識(shí)。
uploadLocalVideo
上傳本地視頻的接口。
uploadWebVideo
上傳網(wǎng)絡(luò)視頻的接口。
uploadLocalImage
上傳本地圖片。
uploadWebImage
上傳網(wǎng)絡(luò)圖片。
uploadLocalAttachedMedia
上傳本地輔助媒資文件。
uploadWebAttachedMedia
上傳網(wǎng)絡(luò)輔助媒資文件。
uploadLocalM3u8
上傳本地m3u8文件。
uploadWebM3u8
上傳網(wǎng)絡(luò)m3u8文件。
parseM3u8File
解析m3u8索引文件得到分片地址列表。
setEcsRegionId
設(shè)置上傳腳本部署的ECS區(qū)域(如果有),如果與視頻點(diǎn)播存儲(chǔ)同一區(qū)域會(huì)自動(dòng)啟用內(nèi)網(wǎng)上傳。
setEnableSSL
是否啟用SSL(網(wǎng)絡(luò)請(qǐng)求使用HTTPS),默認(rèn)不啟用,以避免相關(guān)擴(kuò)展未安裝或配置異常時(shí)無(wú)法使用。
uploadProgressCallback
上傳進(jìn)度回調(diào)函數(shù),可重寫(xiě)。
AliyunVodUtils.php
目錄
說(shuō)明
AliyunVodUtils
工具類(lèi),提供截取字符串、獲取擴(kuò)展名、獲取文件名等靜態(tài)函數(shù)。
AliyunVodLog
實(shí)現(xiàn)簡(jiǎn)單打印的日志類(lèi),logSwitch為日志開(kāi)關(guān)。
AliyunVodDownloader
實(shí)現(xiàn)下載網(wǎng)絡(luò)文件。
AliyunVodReportUpload
實(shí)現(xiàn)上傳進(jìn)度匯報(bào)。
AliyunVodError
定義錯(cuò)誤碼。
/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/voduploadsdk
aliyun-php-sdk-core:上傳SDK依賴(lài)的基礎(chǔ)類(lèi),封裝了阿里云API簽名和HTTP請(qǐng)求等。
aliyun-php-sdk-vod:視頻點(diǎn)播的服務(wù)端接口SDK,封裝了視頻點(diǎn)播API的請(qǐng)求。
aliyun-php-sdk-oss:上傳SDK依賴(lài)的OSS類(lèi),封裝了OSS上傳等操作。
/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/samples
uploadVideo.php:上傳視頻的示例代碼。
uploadImage.php:上傳圖片的示例代碼。
uploadAttachedMedia.php:上傳輔助媒資的示例代碼。
場(chǎng)景一:上傳音視頻
普通音視頻
音視頻上傳目前支持以下類(lèi)型文件上傳:
上傳本地文件,使用分片上傳,最大支持48.8 TB的單個(gè)文件,不支持?jǐn)帱c(diǎn)續(xù)傳。請(qǐng)參見(jiàn)testUploadLocalVideo函數(shù)。
上傳網(wǎng)絡(luò)文件,可指定文件URL進(jìn)行上傳,最大支持48.8 TB的單個(gè)文件。該上傳方式需要先將網(wǎng)絡(luò)文件下載到本地磁盤(pán),再進(jìn)行上傳,所以要保證本地磁盤(pán)有充足的空間。請(qǐng)參見(jiàn)testUploadWebVideo函數(shù)。
<?php
/**
* Created by Aliyun ApsaraVideo VOD.
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
//測(cè)試上傳本地視頻
function testUploadLocalVideo($accessKeyId, $accessKeySecret, $filePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($filePath, 'testUploadLocalVideo via PHP-SDK');
//$uploadVideoRequest->setCateId(1);
//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('6ae347b0140181ad371d197ebe289****');
$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());
}
}
// 測(cè)試上傳網(wǎng)絡(luò)視頻
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());
}
}
#### 執(zhí)行測(cè)試代碼 ####
// 阿里云賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,建議您使用RAM用戶(hù)進(jìn)行API訪問(wèn)或日常運(yùn)維。
// 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
// 本示例通過(guò)從環(huán)境變量中讀取AccessKey,來(lái)實(shí)現(xiàn)API訪問(wèn)的身份驗(yàn)證。運(yùn)行代碼示例前,請(qǐng)配置環(huán)境變量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);
M3U8視頻文件
部分代碼示例如下所示:
<?php
/**
* Created by Aliyun ApsaraVideo VOD.
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 測(cè)試上傳本地m3u8視頻
function testUploadLocalM3u8($accessKeyId, $accessKeySecret, $m3u8FilePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($m3u8FilePath, 'testUploadLocalM3u8 via PHP-SDK');
// 調(diào)用接口解析m3u8的分片地址列表,如果解析結(jié)果不準(zhǔn)確,請(qǐng)自行拼接地址列表(默認(rèn)分片文件和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());
}
}
// 測(cè)試上傳網(wǎng)絡(luò)m3u8視頻
function testUploadWebM3u8($accessKeyId, $accessKeySecret, $m3u8FileUrl)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($m3u8FileUrl, 'testUploadWebM3u8 via PHP-SDK');
// 調(diào)用接口解析m3u8的分片地址列表,如果解析結(jié)果不準(zhǔn)確,請(qǐng)自行拼接地址列表(默認(rèn)分片文件和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());
}
}
#### 執(zhí)行測(cè)試代碼 ####
// 阿里云賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,建議您使用RAM用戶(hù)進(jìn)行API訪問(wèn)或日常運(yùn)維。
// 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
// 本示例通過(guò)從環(huán)境變量中讀取AccessKey,來(lái)實(shí)現(xiàn)API訪問(wèn)的身份驗(yàn)證。運(yùn)行代碼示例前,請(qǐng)配置環(huán)境變量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);
場(chǎng)景二:上傳圖片
<?php
/**
* Created by Aliyun ApsaraVideo VoD.
* User: https://www.aliyun.com/product/vod
* API document: http://bestwisewords.com/document_detail/55619.html
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 測(cè)試上傳本地圖片
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());
}
}
// 測(cè)試上傳網(wǎng)絡(luò)圖片
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());
}
}
#### 執(zhí)行測(cè)試代碼 ####
// 阿里云賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,建議您使用RAM用戶(hù)進(jìn)行API訪問(wèn)或日常運(yùn)維。
// 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
// 本示例通過(guò)從環(huán)境變量中讀取AccessKey,來(lái)實(shí)現(xiàn)API訪問(wèn)的身份驗(yàn)證。運(yùn)行代碼示例前,請(qǐng)配置環(huán)境變量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);
場(chǎng)景三:上傳輔助媒資文件
部分代碼示例如下所示:
<?php
/**
* Created by Aliyun ApsaraVideo VoD.
* User: https://www.aliyun.com/product/vod
* API document: http://bestwisewords.com/document_detail/98467.html
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 測(cè)試上傳本地輔助媒資文件
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());
}
}
// 測(cè)試上傳網(wǎng)絡(luò)輔助媒資文件
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());
}
}
#### 執(zhí)行測(cè)試代碼 ####
// 阿里云賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,建議您使用RAM用戶(hù)進(jìn)行API訪問(wèn)或日常運(yùn)維。
// 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
// 本示例通過(guò)從環(huán)境變量中讀取AccessKey,來(lái)實(shí)現(xiàn)API訪問(wèn)的身份驗(yàn)證。運(yùn)行代碼示例前,請(qǐng)配置環(huán)境變量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);