Multipart Upload

最終更新日:2025-12-26 17:32:31

マルチパートアップロードでは、1本の動画を複数のパート(ブロック)に分割し、同時または順次にアップロードすることができます。この方法は、大容量動画のアップロードに推奨されており、高い信頼性とアップロード再開機能(ブレークポイント継続)をサポートします。

1. 概要とコンセプト

この方式で動画を正常にアップロードするには、ブロックチャンクという2つの重要な概念を理解する必要があります。

  • ブロック: 動画は固定サイズのブロックに分割されます。
    • サイズ制限: ブロックサイズは4MBの倍数(例:4MB、8MB、12MB)である必要があります。これは動画のETag計算における整合性にとって非常に重要です。
    • 最終ブロック: 最後のブロックは動画の実際の残りサイズで分割されます(4MBの倍数である必要はありません)。
    • 小さい動画: 動画全体が設定されたブロックサイズより小さい場合、動画は1つのブロックのみで構成されます。
  • チャンク: 各ブロック内でデータは「チャンク」と呼ばれる単位で順次アップロードされます。チャンクは、ブロック内の転送用にスライスされたデータ単位です。

基本のワークフロー:

  1. 動画の分割: 選択したサイズ(4MBの倍数である必要があります)に基づき、動画全体を複数のブロックに分割します。
  2. Slice Blocks: 各ブロックをさらに小さな「チャンク」に分割して転送します。
  3. ブロックの初期化(/mkblk): サーバー上に対応するブロックを作成するため、最初のチャンクをアップロードします。
  4. 残りのチャンクのアップロード(/bput): 特定のブロックに対し、すべての後続チャンクをアップロードし、ブロックを完成させます。
  5. 繰り返し: 動画内のすべてのブロックに対して手順3と4を実行します(複数のブロックを並行してアップロード可能です)。
  6. マージ(/mkfile): すべてのブロックがアップロードされたら、指定した順序でサーバーにブロック情報を結合させ、最終的な動画を作成します。

证书申请功能升级

2. 前提条件

本ドキュメント内の各エンドポイントを呼び出す前に、アップロードの認証情報を取得する必要があります。

  1. アップロードトークン取得/vod/videoManage/getUploadToken)を呼び出してください。
  2. レスポンスから下記の値を抽出し、Multipart Uploadリクエストで使用してください。
トークンレスポンスの値 マルチパートヘッダー/パラメータに対応 説明
uploadUrl Host (ベースURL) アップロードリクエストを送信するDomainです。
uploadToken Authorization アップロードリクエストの認証用トークンです。
fileKey Key 動画ストレージの一意の識別子/パスです。

3. API リファレンス

ステップ 1: ブロックの作成と最初のチャンクのアップロード

このエンドポイントは新しいブロックを初期化し、そのブロックの最初のデータチャンクをアップロードします。

エンドポイント:POST <uploadUrl>/mkblk/<BlockSize>/<BlockIndex>

パスパラメータ

パラメータ 必須 説明
BlockSize 整数型 必須 ブロックのサイズ(バイト単位)。最後のブロック以外は**4 MB(4194304)**の倍数である必要があります。最後のブロックのみ実際の残りサイズになります。
BlockIndex 整数型 必須 ブロックのゼロ始まりのインデックス(例:最初のブロックは0、2番目は1)。

リクエストヘッダー

ヘッダー 必須 説明
Authorization String 必須 Get Upload Token APIから取得したuploadToken
Content-Length Integer 必須 アップロードされる現在のチャンクのサイズ(バイト単位)。
Content-Type String 必須 固定値:application/octet-stream
UploadBatch UUID 必須 この特定の動画アップロードセッションを識別するため、クライアントが生成したランダムなUUID文字列。同じ動画に関する全てのリクエストで同じUUIDを利用してください。
Key String 必須 fileKey(または対象動画パス)。アップロードポリシーでも指定可能。

リクエストボディ

  • バイナリデータ: 最初のチャンクの生のバイナリコンテンツ。

レスポンス例

{
    "ctx": "ExampleContextStringForNextChunk..."
    "checksum": "checksum_string",
    "crc32": 123456789,
    "offset": 4194304
}


  • ctx: 次のbputリクエストに必要なコンテキスト文字列です。次回チャンクアップロードのために必ず保存してください。
  • checksum: アップロードされたブロックのチェックサムです。
  • crc32: アップロードされたブロックのCRC32値です。これを使用してアップロードデータの整合性を検証できます。
  • offset: このブロックで次に期待されるオフセットです。

ステップ2:後続チャンクのアップロード

このエンドポイントを使用して、特定のブロックの残りのチャンクをアップロードします。現在のブロックが完全にアップロードされるまで、この呼び出しを繰り返す必要があります。

エンドポイント: POST <uploadUrl>/bput/<Ctx>/<NextChunkOffset>

パスパラメータ

パラメーター 必須 説明
Ctx 文字列 はい 前回の /mkblk または /bput 応答で返されたコンテキスト文字列です。この値によってチャンクが正しいブロックに紐付けられます。
NextChunkOffset 整数 はい ブロック内で現在のチャンクが開始されるオフセットを示します。前回の応答で返された offset と一致します。

リクエストヘッダー

ヘッダー 必須 説明
Authorization 文字列 はい uploadToken です。
Content-Length Integer 必須 アップロード中の現在のチャンクのサイズ(バイト単位)。
Content-Type String 必須 固定値:application/octet-stream
UploadBatch UUID 必須 ステップ1で使用したUUIDと同じ値。
Key String 必須 fileKey

リクエストボディ

  • バイナリデータ:現在のチャンクの生バイナリコンテンツ。

レスポンス例

{
    "ctx": "次のチャンク用のExampleContextString...",
    "checksum": "checksum_string",
    "crc32": 123456789,
    "offset": 8388608
}


  • ctx: 次の bput リクエストに必要な更新後のコンテキスト文字列です。
  • checksum: アップロード済みブロックのチェックサム値です。
  • crc32: CRC32値です。
  • offset: このブロックに対して次に期待されるoffset値です。

手順3:アップロードの完了(動画ファイルの作成)

すべてのブロックのアップロードが正常に完了したら、このエンドポイントを呼び出して最終的な動画にマージしてください。

エンドポイント:POST <uploadUrl>/mkfile/<FileSize>

注意: オプションパラメーターはURL形式に追加できます:<uploadUrl>/mkfile/<FileSize>/x:<UserParam>/<EncodedValue>

パスパラメーター

パラメーター 必須 説明
FileSize 整数 はい 動画全体のサイズ(バイト単位)です。

リクエストヘッダー

ヘッダー 必須 説明
Authorization 文字列 必須 uploadToken です。
Content-Type 文字列 必須 固定値: text/plain;charset=UTF-8
UploadBatch UUID 必須 前のステップで使用したのと同じUUIDです。
Key 文字列 必須 fileKey です。
MimeType 文字列 任意 動画用のカスタムMIMEタイプです。
DeleteAfterDays 整数 任意 動画を保持する日数です。0は即時削除を意味します(推奨されません)。

リクエストボディ

各ブロックのインデックス順に並べた、各ブロックで最後に返された ctx 文字列のカンマ区切りリストです。

フォーマット:

<LastCtxOfBlock0>,<LastCtxOfBlock1>,<LastCtxOfBlock2>


レスポンス例

{
    "hash": "FqlKj-9023...",
    "key": "video/2023/example.mp4"
}


4. ベストプラクティスと注意事項

  • 同時実行: プロセスの高速化のため、異なるBlocksを並行してアップロードできます。ただし、1つのBlock内のChunksは順番にアップロードする必要があります。
  • アップロードの再開: アップロードに失敗した場合でも、最初からやり直す必要はありません。ローカルの進捗状況とサーバーのoffset応答を照合することで、最後に成功したBlockまたはChunkから再開できます。
  • クリーンアップ: サーバーは未完了のBlockを定期的に(約30日ごとに)クリーンアップします。ビデオの最終化のため、必ず/mkfileステップを完了させてください。