JavaScript アップロード SDK を使用して、メディアファイルを ApsaraVideo VOD にアップロードします。
ブラウザ要件
ブラウザ | 対応 | バージョン |
IE | ✔️ | Internet Explorer 10 以降 |
Microsoft Edge | ✔️ | すべて |
Chrome | ✔️ | 主要なバージョン |
Firefox | ✔️ | |
Safari | ✔️ | |
Android 標準ブラウザ | ✔️ | |
iOS 標準ブラウザ | ✔️ | |
Windows Phone 標準ブラウザ | ✔️ |
機能説明
JavaScript アップロード SDK は、音声、動画、画像のアップロードのみをサポートします。補助メディアアセットはサポートされていません。
SDK とデモのダウンロード
SDK バージョン:1.5.7
更新日:2024 年 1 月 30 日
ダウンロード先:JavaScript アップロード SDK V1.5.7 および jQuery と Vue のデモソースコード
実装方法
JavaScript アップロード SDK は OSS SDK に依存します。 window.OSS を有効な値に設定してください。 設定しないと、 ReferenceError: OSS is not defined が発生します。
(推奨)<script> タグによるインポート
<!-- Internet Explorer には es6-promise が必要です。Internet Explorer 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.7.min.js"></script>モジュールによるインポート
OSS モジュールを手動で window.OSS に割り当てます。
<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.7.min'基本設定
アップロードインスタンスの初期化
userId パラメータを指定して、アップロード者を識別します。Alibaba Cloud アカウントセンターで取得した Alibaba Cloud アカウント ID またはカスタムユーザー ID を使用してください。userId が null または未指定の場合、エラーが発生します。
regionパラメータをサポートされている ApsaraVideo VOD リージョン ID に設定してください。詳細については、「ApsaraVideo VOD リージョン ID」をご参照ください。
var uploader = new AliyunUpload.Vod({
// 必須。アップロード者の ID。Alibaba Cloud アカウント ID またはカスタムユーザー ID を指定できます。ID は Alibaba Cloud アカウントセンター (https://account-console.alibabacloud.com/) で確認できます。
userId: "122",
// アップロード先のリージョン。デフォルト値: cn-shanghai
// 例:eu-central-1、ap-southeast-1
region: "",
// マルチパートアップロードでの各パートのサイズ。単位:バイト。サイズは 100 KB (100 × 1024) 未満にはできません。デフォルト値: 1 MB (1 × 1024 × 1024)
partSize: 1048576,
// 並列アップロードできるパートの最大数。デフォルト値: 5
parallel: 5,
// ネットワークエラー時の最大リトライ回数。デフォルト値: 3
retryCount: 3,
// ネットワークエラー時のリトライ間隔。単位:秒。デフォルト値: 2
retryDuration: 2,
// アップロード開始時のコールバック。
onUploadstarted: function (uploadInfo) {},
// アップロード成功時のコールバック。
onUploadSucceed: function (uploadInfo) {},
// アップロード失敗時のコールバック。
onUploadFailed: function (uploadInfo, code, message) {},
// アップロード進行状況のコールバック。単位:バイト。
onUploadProgress: function (uploadInfo, totalSize, loadedPercent) {},
// アップロード認証情報/STS トークンの有効期限切れ時のコールバック。
onUploadTokenExpired: function (uploadInfo) {},
// 全ファイルのアップロード完了時のコールバック。
onUploadEnd: function (uploadInfo) {},
});
認証情報の設定
続行する前に、クライアントアップロードプロセスを理解し、承認サービスをデプロイしてください。 詳細については、「クライアントからのアップロード」をご参照ください。
方法1:アップロード URL と認証情報を使用する場合は、承認サービスからアップロード URL と認証情報を取得します。
方法2:STS トークンを使用する場合は、承認サービスから STS トークンを取得します。詳細については、「STS トークンの取得」をご参照ください。
返された承認情報を onUploadstarted コールバック内で設定します。 認証情報の有効期限が切れると、 onUploadTokenExpired コールバックが呼び出されます。 更新操作を呼び出して認証情報を再取得してください。
方法1:アップロード URL と認証情報
setUploadAuthAndAddress を呼び出して、アップロード URL と認証情報を設定します。認証情報の有効期限が切れると、onUploadTokenExpired コールバックが呼び出されます。新しい認証情報を使用して resumeUploadWithAuth を呼び出し、アップロードを再開してください。
// アップロード開始時のコールバック。
onUploadstarted: function (uploadInfo) {
let refreshUrl = 'https://demo-vod.cn-shanghai.aliyuncs.com/voddemo/RefreshUploadVideo?BusinessType=vodai&TerminalType=pc&DeviceModel=iPhone9,2&UUID=59ECA-4193-4695-94DD-7E1247288&AppVersion=1.0.0&Title=haha1&FileName=xxx.mp4&VideoId=' + uploadInfo.videoId
axios.get(refreshUrl).then(({data}) => {
let uploadAuth = data.UploadAuth
let uploadAddress = data.UploadAddress
let videoId = data.VideoId
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress,videoId)
})
},
// アップロード認証情報の有効期限切れ時のコールバック。
onUploadTokenExpired: function (uploadInfo) {
// 方法1 (UploadAuth) を使用して大きなファイルのアップロードがタイムアウトした場合、
// uploadInfo.videoId に基づいて RefreshUploadVideo API を呼び出し、UploadAuth の値を再取得します。
// 次に、resumeUploadWithAuth メソッドを呼び出します。この例では、resumeUploadWithAuth がテスト用のメソッドであるため、UploadAuth の値を直接取得しています。
let refreshUrl = 'https://demo-vod.cn-shanghai.aliyuncs.com/voddemo/RefreshUploadVideo?BusinessType=vodai&TerminalType=pc&DeviceModel=iPhone9,2&UUID=59ECA-4193-4695-94DD-7E1247288&AppVersion=1.0.0&Title=haha1&FileName=xxx.mp4&VideoId=' + uploadInfo.videoId
axios.get(refreshUrl).then(({data}) => {
let uploadAuth = data.UploadAuth
uploader.resumeUploadWithAuth(uploadAuth)
console.log('upload expired and resume upload with uploadauth ' + uploadAuth)
})
self.statusText = 'アップロードがタイムアウトしました...'
},メソッドの説明
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress, videoId)
uploader.resumeUploadWithAuth(uploadAuth)パラメータ | 説明 |
uploadInfo | onUploadstarted コールバックの最初のパラメータ。 |
uploadAuth | CreateUploadVideo API が返すアップロード認証情報。 |
uploadAddress | CreateUploadVideo API が返すアップロード URL。 |
videoId | CreateUploadVideo API が返す音声または動画 ID。 |
方法2:STS トークン
setSTSToken を呼び出して STS トークンを設定します。トークンの有効期限が切れると、onUploadTokenExpired コールバックが呼び出されます。新しいトークンを使用して resumeUploadWithSTSToken を呼び出し、アップロードを再開してください。
/* コールバック:アップロード開始 */
onUploadstarted: function (uploadInfo) {
/* STS トークンを取得し、setSTSToken メソッドで設定します。*/
let stsUrl = "***.***.stsUrl"
axios.get(stsUrl).then(({data}) => {
var info = data.SecurityTokenInfo
uploader.setSTSToken(uploadInfo, info.AccessKeyId, info.AccessKeySecret, info.SecretToken);
})
},
/* コールバック:認証情報タイムアウト */
onUploadTokenExpired: function (uploadInfo) {
/* STS トークンを更新し、resumeUploadWithSTSToken メソッドでアップロードを再開します。*/
let stsUrl = "***.***.stsUrl"
axios.get(stsUrl).then(({data}) => {
var info = data.SecurityTokenInfo
uploader.resumeUploadWithSTSToken(info.AccessKeyId, info.AccessKeySecret, info.SecretToken);
})
},
メソッドの説明
uploader.setSTSToken(uploadInfo, accessKeyId, accessKeySecret, secretToken)
uploader.resumeUploadWithSTSToken(accessKeyId, accessKeySecret, secretToken)パラメータ | 説明 |
uploadInfo | onUploadstarted コールバックの最初のパラメータ。 |
accessKeyId | STS トークン内の |
accessKeySecret | STS トークン内の |
secretToken | STS トークン内の |
ファイルの追加
<input type="file" /> の change イベントをリッスンして、ファイルを uploader リストに追加します。
ネイティブ JavaScript
<form action="">
<input type="file" name="file" id="files" multiple/>
</form>
<script>
userData = '';
document.getElementById("files")
.addEventListener('change', function (event) {
for(var i=0; i<event.target.files.length; i++) {
// ロジックコード
uploader.addFile(event.target.files[i],null,null,null,null)
}
});
</script>
Vue
<template>
<input type="file" id="fileUpload" @change="fileChange($event)">
</template>
<script>
export default {
data () {
return {
file: null,
}
},
methods: {
fileChange (e) {
this.file = e.target.files[0]
if (!this.file) {
alert("アップロードするファイルを選択してください。")
return
}
var Title = this.file.name
var userData = '{"Vod":{}}'
if (this.uploader) {
this.uploader.stopUpload()
}
// アップローダーを初期化します。
this.uploader = this.createUploader()
this.uploader.addFile(this.file, null, null, null, userData)
},
}
}
</script>メソッドの説明
uploader.addFile(file,endpoint,bucket,object,paramData)パラメータ | 必須 | タイプ | 説明 |
file | はい | File | アップロードするファイル。 |
endpoint | いいえ | String | OSS エンドポイント。null の場合、AppServer 側で選択されます。 |
bucket | いいえ | String | ターゲットバケット。null の場合、AppServer 側で選択されます。 |
object | いいえ | String | ターゲットオブジェクト。null の場合、AppServer 側で選択されます。 |
paramData | いいえ | String | タイトル、説明、トランスコーディング、コールバック設定などのファイルメタデータ。 STS トークンアップロードを使用する場合は、
|
アップロードの開始
uploader.startUpload();ファイルアップロードが開始されると、
onUploadProgressコールバックが呼び出され、アップロードの進行状況が通知されます。ファイルアップロードが成功すると、
onUploadSucceedコールバックが呼び出され、アップロード結果が返されます。
アップロード進行状況の表示
// ファイルのアップロード進捗コールバック。 単位:バイト。 この関数で進捗状況を取得し、ページに表示できます。
onUploadProgress: function (uploadInfo, totalSize, progress) {
console.log("onUploadProgress:file:" + uploadInfo.file.name + ", fileSize:" + totalSize + ", percent:" + Math.ceil(progress * 100) + "%")
let progressPercent = Math.ceil(progress * 100)
self.authProgress = progressPercent
self.statusText = 'アップロード中...'
},アップロード結果の取得
// アップロード成功時のコールバック。
onUploadSucceed: function (uploadInfo) {
console.log("onUploadSucceed: " + uploadInfo.file.name + ", endpoint:" + uploadInfo.endpoint + ", bucket:" + uploadInfo.bucket + ", object:" + uploadInfo.object)
self.statusText = 'アップロードが成功しました!'
},
// アップロード失敗時のコールバック。
onUploadFailed: function (uploadInfo, code, message) {
console.log("onUploadFailed: file:" + uploadInfo.file.name + ",code:" + code + ", message:" + message)
self.statusText = 'アップロードが失敗しました!'
},高度な機能
アップロードアクセラレーションの使用
大容量ファイル (GB/TB) のアップロードや、中国本土からシンガポール リージョンへのアップロードなどのクロスリージョンアップロードを高速化します。
アップロードアクセラレーション機能を有効にするには、Alibaba Cloud アカウント UID と、加速対象のストレージアドレスを提供する必要があります。
アップロードアクセラレーション機能を有効にするには、チケットを送信してください。Alibaba Cloud アカウント UID とアップロードアクセラレーションを使用するストレージアドレスを提供してください。
方法1:アップロード URL と認証情報
CreateUploadVideo API を呼び出し、UserData パラメータでアクセラレーションを設定します。
UserData={
"AccelerateConfig": {
"Type": "oss",
"Domain": "https://oss-accelerate.aliyuncs.com"
}
}方法2:STS トークン
addFile メソッドを呼び出す際、 UserData プロパティを paramData パラメータに含めます。
uploader.addFile(file,null,null,null,'{"Vod":{"UserData":{"AccelerateConfig":{"Type":"oss","Domain":"https://oss-accelerate.aliyuncs.com"}}}}');UserData の説明
名前 | タイプ | 必須 | 説明 |
UserData | String | いいえ | コールバックやアップロードアクセラレーションなどのカスタム設定。 JSON 形式の文字列である必要があります。 |
パラメータの詳細は次の表を参照してください。
パラメータ | タイプ | 説明 |
Type | String | アップロードアクセラレーションのタイプ。 oss に設定します。 |
Domain | String | アクセラレーションドメイン名。 デフォルトは HTTPS です。 説明 アップロードアクセラレーションを有効にした後に割り当てられるアクセラレーションエンドポイントを使用します (例:vod-*******.oss-accelerate.aliyuncs.com) 。 |
UserData の設定方法の詳細は、「リクエストパラメータの説明」をご参照ください。
アップロードの停止
stopUpload は、ファイルがアップロード中の場合にのみ有効です。
uploader.stopUpload();ファイルリストの管理
次の操作で、アップロード中またはアップロード済みのファイルを管理できます。
listFiles:アップロードリストを照会します。
addFile で追加されたファイルのリストを返します。 file プロパティはファイルタイプを示します。 リストを走査して、管理操作に使用するファイルのインデックスを取得します。
var list = uploader.listFiles(); for (var i=0; i<list.length; i++) { console.log("file:" + list[i].file.name); }deleteFile:アップロード予定のファイルを削除します。
uploader.deleteFile(index); // 削除するファイルのインデックス。 インデックスは listFiles で取得します。cancelFile:ファイルのアップロードをキャンセルします。
説明cancelFileを呼び出すと、コンソールにoss is cancel as errorというメッセージが表示されます。これにより、アップロードされたパートがストレージを占有してコストが発生するのを防ぎます。キャンセルされたアップロードを再開するには、まず
uploader.resumeFile(index);を呼び出してファイルを復元してください。
uploader.cancelFile(index);resumeFile:ファイルのアップロードを再開します。
uploader.resumeFile(index);cleanList:アップロードリストをクリアします。
uploader.cleanList();
再開可能なアップロード
ページのクラッシュやブラウザーのエラーによってアップロードが失敗した場合、SDK は再アップロード時にブレークポイントから再開し、onUploadstarted コールバックから認証情報を取得します。方法 1: アップロード URL と認証情報を使用すると、videoId を使用して ApsaraVideo VOD API 操作を呼び出し、ブレークポイント情報を取得できます。
// アップロード開始時のコールバック。
onUploadstarted: function (uploadInfo) {
// UploadAuth を使用する場合、uploadInfo.videoId の有無に応じて、呼び出す ApsaraVideo VOD API を切り替え、uploadAuth と uploadAddress を取得します。
// uploadInfo.videoId に値がある場合は RefreshUploadVideo API を、ない場合は CreateUploadVideo API を呼び出します。
// 注意:このデモはテスト用のため、API を直接呼び出して UploadAuth を取得しています。実際のシナリオでは、uploadInfo.videoId の有無に応じて、呼び出す API を判断してください。
if (!uploadInfo.videoId) {
let createUrl = 'https://demo-vod.cn-shanghai.aliyuncs.com/voddemo/CreateUploadVideo?Title=testvod1&FileName=aa.mp4&BusinessType=vodai&TerminalType=pc&DeviceModel=iPhone9,2&UUID=59ECA-4193-4695-94DD-7E1247288&AppVersion=1.0.0&VideoId=5bfcc7864fc14b96972842172207c9e6'
axios.get(createUrl).then(({data}) => {
let uploadAuth = data.UploadAuth
let uploadAddress = data.UploadAddress
let videoId = data.VideoId
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress,videoId)
})
self.statusText = 'ファイルアップロードが開始されました...'
console.log("onUploadStarted:" + uploadInfo.file.name + ", endpoint:" + uploadInfo.endpoint + ", bucket:" + uploadInfo.bucket + ", object:" + uploadInfo.object)
} else {
// ブレークポイント情報を表示します。
console.log(uploader.getCheckpoint(uploadInfo.file));
// videoId パラメータに値がある場合、動画のアップロードが中断されたことを意味します。SDK はブレークポイントからアップロードを再開します。videoId の値に基づいて、アップロード認証情報を更新する必要があります。
let refreshUrl = 'https://demo-vod.cn-shanghai.aliyuncs.com/voddemo/RefreshUploadVideo?BusinessType=vodai&TerminalType=pc&DeviceModel=iPhone9,2&UUID=59ECA-4193-4695-94DD-7E1247288&AppVersion=1.0.0&Title=haha1&FileName=xxx.mp4&VideoId=' + uploadInfo.videoId
axios.get(refreshUrl).then(({data}) => {
let uploadAuth = data.UploadAuth
let uploadAddress = data.UploadAddress
let videoId = data.VideoId
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress,videoId)
})
}
}ブレークポイント情報の取得:
uploader.getCheckpoint(file);例外処理
例外が発生した場合は、「エラーコード」トピックのクライアントアップロード SDK セクションを確認して、原因を特定してください。