本文介紹如何使用JavaScript SDK將媒體檔案(本地檔案或網路檔案)從用戶端上傳至點播儲存,提供相關SDK的整合及檔案上傳指引。
前提條件
您已經完成上傳相關的系統配置,包括啟用目標儲存地區的儲存地址和配置回調。操作指引請參見管理儲存Bucket及回調設定。
您已準備好用於調用點播服務的帳號。為避免阿里雲帳號AccessKey泄露帶來的安全風險,推薦您建立RAM使用者並授予其VOD相關許可權。然後使用RAM使用者的AK對(AccessKey ID和AccessKey Secret)訪問點播服務。操作指引請參見建立RAM使用者並授權。
JavaScript上傳SDK目前相容的瀏覽器是:
IE 10及以上版本
Edge
主流版本的Chrome/Firefox/Safari
主流版本的Android/iOS/WindowsPhone系統預設瀏覽器
上傳流程
用戶端上傳SDK封裝了OSS上傳邏輯。在用戶端上傳媒體檔案時,會直接將檔案上傳到點播儲存(基於OSS),不會再經服務端進行中轉,故用戶端上傳必須進行鑒權,也就是需要您在應用伺服器上部署授權服務以擷取上傳地址和憑證。目前用戶端上傳SDK支援兩種授權方式:
使用上傳地址和憑證授權:建議整合點播服務端SDK來擷取上傳地址和憑證。
使用STS方式授權:需要提前為RAM使用者建立角色並授權,也需要自行搭建STS授權服務。
上傳地址和憑證方式上傳流程詳解
以整合點播服務端SDK擷取上傳地址和憑證為例,完整的上傳流程如下圖所示:
使用者在上傳應用伺服器部署授權服務(如整合點播服務端SDK)用於擷取上傳地址和憑證。
用戶端向上傳應用伺服器發起請求擷取上傳地址和憑證。
上傳應用伺服器向ApsaraVideo for VOD服務發起請求擷取上傳地址和憑證。
點播服務返回上傳地址和憑證。
說明點播服務在下發上傳地址和憑證時還會自動建立媒資資訊,即媒體ID(MediaId),用於媒資生命週期管理或ApsaraVideo for Media Processing。
擷取視頻上傳地址和憑證返回的
VideoId
即媒體ID。擷取圖片上傳地址和憑證返回的
ImageId
即媒體ID。擷取輔助媒資上傳地址和憑證返回的
MediaId
即媒體ID。請妥善儲存媒體ID,作為媒資管理、音視頻播放、ApsaraVideo for Media Processing等的輸入。
上傳應用伺服器向用戶端下發上傳地址和憑證。
重要下發地址和憑證即可,無需Base64解碼。
用戶端使用上傳地址和憑證初始化上傳執行個體。
用戶端構造上傳參數發起上傳請求。
OSS服務返回上傳結果。
說明上傳結果也可以通過提前配置回調接收上傳相關事件來監聽。
STS方式上傳流程詳解
使用STS方式上傳的完整的流程如下圖所示:
使用者在上傳應用伺服器部署授權服務(如整合阿里雲STS SDK)用於擷取STS臨時Token。
用戶端向上傳應用伺服器發起請求擷取STS臨時Token。
上傳應用伺服器向阿里雲STS服務發起請求擷取STS臨時Token。
阿里雲STS服務返回上傳地址和憑證。
上傳應用伺服器向用戶端下發STS臨時Token。
用戶端使用STS臨時Token初始化上傳執行個體。
用戶端構造請求發起上傳請求。
OSS服務返回上傳結果。
說明上傳結果也可以通過提前配置回調接收上傳相關事件來監聽。
上傳憑證
此處以音視頻上傳憑證為例進行說明,圖片上傳憑證需調用CreateUploadImage - 擷取圖片上傳地址和憑證介面擷取。
設定上傳地址和上傳憑證
設定上傳地址和上傳憑證方法在
onUploadstarted
回調裡調用,此回調的參數包含uploadInfo
的值。const {VideoId,UploadAuth,UploadAddress} = data; uploader.setUploadAuthAndAddress(uploadInfo,UploadAuth,UploadAddress,VideoId);
參數名稱
參數描述
uploadInfo
將onUploadstarted回調中的第一個參數進行透傳
uploadAuth
CreateUploadVideo介面返回
uploadAddress
CreateUploadVideo介面返回
videoId
CreateUploadVideo介面返回
上傳憑證失效後恢複上傳
一般在onUploadTokenExpired回調中調用,用於上傳憑證到期後更新上傳憑證。uploadAuth為RefreshUploadVideo介面中返回的上傳憑證。
const {VideoId,UploadAuth,UploadAddress} = data; uploader.resumeUploadWithAuth(UploadAuth);
設定STS Token
用於通過STS方式進行上傳時,設定上傳地址和上傳憑證方法。一般在
onUploadstarted
回調裡調用,此回調的參數包含uploadInfo
的值。var info = data.SecurityTokenInfo uploader.setSTSToken(uploadInfo,info.AccessKeyId,info.AccessKeySecret,info.SecretToken);
參數名稱
參數描述
uploadInfo
將onUploadstarted回調中的第一個參數進行透傳
accessKeyId
CreateSecurityToken介面返回
accessKeySecret
CreateSecurityToken介面返回
secretToken
CreateSecurityToken介面返回
上傳STS Token失效後恢複上傳
一般在onUploadTokenExpired回調中調用,用於通過STS方式進行上傳時上傳憑證到期後更新上傳憑證。
var info = data.SecurityTokenInfo uploader.resumeUploadWithSTSToken(info.AccessKeyId, info.AccessKeySecret, info.SecretToken);
上傳檔案
使用JavaScript上傳SDK上傳檔案的基本操作步驟如下:
如果Web端上傳中斷,重新上傳可能會產生404報錯。您可以將SDK版本升級至1.5.3及以上版本,再重新上傳即可。如需使用1.5.3之前版本重新上傳,請修改待上傳檔案名稱,不要與上傳中斷的檔案重名,避免報錯。
如需實現在一個頁面同時上傳多個檔案,可通過建立多個上傳執行個體來實現。一個上傳執行個體對應一個上傳檔案,一個上傳執行個體不能同時上傳多個檔案。
引入JavaScript上傳SDK。
JavaScript指令碼下載,請參見SDK下載。上傳SDK當前未提供完整的模組化載入支援,如果通過
import
或require
引用檔案會導致報錯ReferenceError: OSS is not defined
。可根據業務需要選擇使用如下兩種引用方式:(推薦)在HTML中通過script引用
<!-- IE需要es6-promise,目前支援IE 10及以上 --> <script src="../lib/es6-promise.min.js"></script> <script src="../lib/aliyun-oss-sdk-6.17.1.min.js"></script> <script src="../aliyun-upload-sdk-1.5.5.min.js"></script>
模組化引用
手動將OSS模組的內容賦值給Window,範例程式碼如下:
說明如果已經在HTML通過script引用,則不需要重複引用。
import OSS from '../lib/aliyun-upload-sdk/lib/aliyun-oss-sdk-6.17.1.min' window.OSS = OSS; import '../lib/aliyun-upload-sdk/aliyun-upload-sdk-1.5.5.min'
請求上傳地址和憑證或請求STS臨時Token,用於上傳授權。
JavaScript上傳SDK中,檔案上傳流程包含從AppServer擷取上傳憑證(需要服務端接入)和檔案上傳到OSS Server(阿里雲能力)兩部分。接入JavaScript上傳時只需要關心從AppServer擷取上傳憑證並設定給上傳SDK即可,上傳憑證支援以下兩種擷取方式:
- 部署授權服務擷取上傳地址和憑證的操作指引請參見擷取上傳地址和憑證。
- 部署STS服務擷取STS臨時Token的操作指引請參見擷取STS臨時Token。
執行結果
使用擷取到的上傳地址和憑證或STS臨時Token作為入參初始化上傳執行個體。
使用上傳憑證(推薦)或STS臨時Token初始化上傳執行個體。
初始化上傳執行個體分為聲明初始化回調和初始化上傳執行個體兩步。
聲明初始化回調。
初始化上傳執行個體。請根據業務需求選擇用上傳地址和憑證方式或STS方式初始化上傳執行個體。
在
onUploadstarted
回調中,擷取或重新整理上傳憑證。根據實際情況,選擇初始化上傳執行個體的方法。上傳地址和憑證方式(推薦)
以上傳音視頻為例,在上傳開始後觸發的
onUploadstarted
回調中調用setUploadAuthAndAddress(uploadFileInfo, uploadAuth, uploadAddress,videoId)
方法進行設定,上傳圖片的邏輯與之類似。上傳音視頻樣本
說明當擷取到的上傳憑證(UploadAuth)到期時,會觸發
onUploadTokenExpired
回調,需要調用resumeUploadWithAuth(uploadAuth)
方法,設定新的上傳憑證繼續上傳。上傳圖片樣本
說明圖片憑證逾時目前不支援重新整理憑證操作,若憑證逾時請您重新擷取憑證進行上傳,此前的ImageId將失效,您可以選擇刪除此ImageId。
STS方式
在上傳開始後觸發的
onUploadstarted
回調中調用setSTSToken(uploadInfo, accessKeyId, accessKeySecret, secretToken);
方法進行設定。說明當STS臨時Token逾時,會觸發
onUploadTokenExpired
回調,需要調用resumeUploadWithSTSToken(accessKeyId, accessKeySecret, secretToken)
方法,設定新的STS繼續上傳。
根據上傳的檔案類型構造上傳參數。
選擇上傳檔案。
<form action=""> <input type="file" name="file" id="files" multiple/> </form> userData = ''; document.getElementById("files") .addEventListener('change', function (event) { for(var i=0; i<event.target.files.length; i++) { //邏輯代碼 } });
將選中的檔案添加到上傳列表中。
uploader.addFile(file,null,null,null,'{"Vod":{}}');
參數名稱
是否必填
類型
參數描述
file
是
File
需要上傳的音視頻檔案。
endpoint
否
String
想要上傳到的endpoint,傳入null則由服務端決定。
bucket
否
String
想要上傳到的bucket,傳入null則由服務端決定。
object
否
String
想要上傳到的object,傳入null則由服務端決定。
paramData
否
String
當您使用STS方式上傳時,可以通過
paramData
設定音視頻或圖片的標題、描述等資訊,以及設定對音視頻的轉碼、回調等。paramData
是一個JSON對象字串,第一級的Vod
是必須的,通過在Vod
下添加paramData
設定屬性實現。支援設定的屬性,請參見CreateUploadVideo - 擷取音視頻上傳地址和憑證或CreateUploadImage - 擷取圖片上傳地址和憑證。介面樣本如下:
說明paramData只有在STS方式上傳時需要在SDK指定,如果是上傳地址和憑證方式,則在擷取上傳憑證的介面(CreateUploadVideo或CreateUploadImage)的參數裡指定,無需在SDK裡指定paramData參數。
如果同時傳遞了WorkflowId和TemplateGroupId,以WorkflowId為準。
設定名稱和分類
var paramData = '{"Vod":{"Title":"test","CateId":"234"}}';
設定名稱和轉碼
var paramData = '{"Vod":{"Title":"test","TemplateGroupId":"e6bb587b5365ac38a41462a4940****"}}';
設定名稱和工作流程
var paramData = '{"Vod":{"Title":"test","WorkflowId":"e2d027f16b5ee9cdf126266d32d****"}}';
開始上傳。
調用
startUpload()
方法開始上傳。uploader.startUpload();
檔案開始上傳後,
onUploadProgress
回調開始同步上傳進度。檔案上傳成功後,
onUploadSucceed
回調會返回上傳結果。
執行結果
進階功能
上傳控制
停止上傳
stopUpload
要確保檔案正在上傳,有檔案上傳進度時才能工作。
uploader.stopUpload();
隊列管理
對於上傳中或者上傳完成的檔案,可以通過對應的API進行管理。支援的API如下:
擷取上傳檔案清單
傳回值為通過addFile添加的檔案資訊列表。其中的file屬性為對應的File類型的檔案,可以通過遍曆擷取到需要操作的檔案的index。
var list = uploader.listFiles(); for (var i=0; i<list.length; i++) { log("file:" + list[i].file.name); }
刪除上傳檔案
uploader.deleteFile(index);//需要刪除的檔案index,對應listFiles介面返回列表中元素的索引
取消單個檔案上傳
說明cancelFile
成功後會在控制台列印oss is cancel as error
。這是SDK為了避免已上傳的部分分區檔案佔用儲存空間(如果佔用就會產生儲存費用)做的處理。取消檔案上傳後,如果後續還需要繼續上傳該檔案,則需要先使用
uploader.resumeFile(index);
恢複該檔案後,再進行上傳。
uploader.cancelFile(index);
恢複單個檔案上傳
uploader.resumeFile(index);
清理上傳檔案清單
uploader.cleanList();
斷點續傳
在音視頻上傳過程中,由於某種原因(例如:頁面被關閉、瀏覽器崩潰等)沒有上傳完成,下次選擇同一個檔案上傳時, SDK會從上次完成的位置繼續上傳,並在onUploadstarted
回調中擷取上傳憑證。使用上傳地址和憑證方式上傳時,使用者可以根據回調返回的videoId的值,調用ApsaraVideo for VOD的介面擷取斷點資訊。樣本如下:
onUploadstarted: function (uploadInfo) {
if (上傳方式1) {
if(!uploadInfo.videoId)//這個檔案沒有上傳異常
{
//實際環境中調用ApsaraVideo for VOD的擷取上傳憑證介面
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress,videoId);
}
else//如果videoId有值,根據videoId重新整理上傳憑證
{
//實際環境中調用ApsaraVideo for VOD的重新整理上傳憑證介面,擷取憑證
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress);
}
}
else(上傳方式2)
{
//實際環境中調用擷取STS介面,擷取STS的值
uploader.setSTSToken(uploadInfo, accessKeyId, accessKeySecret,secretToken);
}
}
擷取斷點資訊:
uploader.getCheckpoint(file);