パーツのアップロード
パーツのアップロード
大きいファイルをアップロードする際は、そのファイルを小さいパーツに分割し、パーツのアップロードAPIを使用してそれらのパーツをアップロードできます。
アップロードセッションの作成
最初にアップロードセッションを作成します。結果のオブジェクトにより、各パーツのサイズとアップロードするパーツの数が定義されます。
{
"id": "F971964745A5CD0C001BBE4E58196BFD",
"type": "upload_session",
"session_expires_at": "2012-12-12T10:53:43-08:00",
"part_size": 1024,
"total_parts": 1000,
"num_parts_processed": 455,
"session_endpoints": {
"upload_part": "https://upload.box.com/api/2.0/files/upload_sessions/F971964745A5CD0C001BBE4E58196BFD",
"commit": "https://upload.box.com/api/2.0/files/upload_sessions/F971964745A5CD0C001BBE4E58196BFD/commit",
"abort": "https://upload.box.com/api/2.0/files/upload_sessions/F971964745A5CD0C001BBE4E58196BFD",
"list_parts": "https://upload.box.com/api/2.0/files/upload_sessions/F971964745A5CD0C001BBE4E58196BFD/parts",
"status": "https://upload.box.com/api/2.0/files/upload_sessions/F971964745A5CD0C001BBE4E58196BFD",
"log_event": "https://upload.box.com/api/2.0/files/upload_sessions/F971964745A5CD0C001BBE4E58196BFD/log"
}
}
ファイルの分割
ファイルをアップロードするパーツに分割します。コマンドラインを使用する場合は、splitコマンドを使用します。
split -b <PART_SIZE> <FILE_NAME> <YOUR_PART_NAME>
例:
split -b 8388608 video.mp3 videopart
これにより、ファイルが複数のファイルに分割されます。
SHAダイジェストの取得
SHAダイジェストの値を取得するには、次のopenSSLコマンドを使用して、ファイルのパーツをエンコードします。
openssl sha1 -binary <FILE_PART_NAME> | base64
例:
openssl sha1 -binary videoparta | base64
その結果、Base64でエンコードされたメッセージがアップロードの検証に使用されます。
パーツのアップロード
アップロードするパーツのデータをアップロードします。その際、パーツのバイト範囲と、コンテンツを適切にアップロードするためのSHAダイジェストを指定します。
curl -i -X PUT "https://upload.box.com/2.0/files/upload_sessions/F971964745A5CD0C001BBE4E58196BFD" \
-H "authorization: Bearer <ACCESS_TOKEN>" \
-H "digest: sha=fpRyg5eVQletdZqEKaFlqwBXJzM=" \
-H "content-range: bytes 8388608-16777215/445856194" \
-H "content-type: application/octet-stream" \
--data-binary @<FILE_NAME>await client.chunkedUploads.uploadFilePart(
acc.uploadSessionId,
generateByteStreamFromBuffer(chunkBuffer),
{
digest: digest,
contentRange: contentRange,
} satisfies UploadFilePartHeadersInput,
);client.chunked_uploads.upload_file_part(
acc.upload_session_id,
generate_byte_stream_from_buffer(chunk_buffer),
digest,
content_range,
)await client.ChunkedUploads.UploadFilePartAsync(uploadSessionId: acc.UploadSessionId, requestBody: Utils.GenerateByteStreamFromBuffer(buffer: chunkBuffer), headers: new UploadFilePartHeaders(digest: digest, contentRange: contentRange));try await client.chunkedUploads.uploadFilePart(uploadSessionId: acc.uploadSessionId, requestBody: Utils.generateByteStreamFromBuffer(buffer: chunkBuffer), headers: UploadFilePartHeaders(digest: digest, contentRange: contentRange))client.getChunkedUploads().uploadFilePart(acc.getUploadSessionId(), generateByteStreamFromBuffer(chunkBuffer), new UploadFilePartHeaders(digest, contentRange))await client.ChunkedUploads.UploadFilePartAsync(uploadSessionId: acc.UploadSessionId, requestBody: Utils.GenerateByteStreamFromBuffer(buffer: chunkBuffer), headers: new UploadFilePartHeaders(digest: digest, contentRange: contentRange));await client.chunkedUploads.uploadFilePart(
acc.uploadSessionId,
generateByteStreamFromBuffer(chunkBuffer),
{
digest: digest,
contentRange: contentRange,
} satisfies UploadFilePartHeadersInput,
);コンテンツの範囲
各パーツのサイズは、作成したアップロードセッションで指定されているパーツサイズとまったく同じサイズである必要があります。ただし、ファイルの最後のパーツは小さくなる可能性があるため、例外となります。Content-Rangeパラメータの定義は、次のパターンに従います。
-H "Content-Range: bytes <LOWER_BOUND>-<HIGHER_BOUND>/<TOTAL_SIZE>"
Content-Rangeの値を指定する際は、以下の点に注意してください。
- 各パーツのバイト範囲の下限は、パーツサイズの倍数にする必要があります。
- 上限は、パーツサイズの倍数から1を引いた値にする必要があります。
たとえば、パーツサイズが8388608の場合、最初の2つのパーツのコンテンツの範囲は次のようになります。
-H "Content-Range: bytes 0-8388607/32127641" \ ## first part
-H "Content-Range: bytes 8388608-16777215/32127641" \ ## second part
レスポンス
各アップロードの後、結果のレスポンスには、アップロードされたパーツのIDとSHAが含まれます。
{
"part_id": "6F2D3486",
"offset": 16777216,
"size": 3222784,
"sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc"
}
範囲の重複
パーツアップロードのリクエストがエラーコードrange_overlaps_existing_partで失敗するのは、アプリケーションがファイルの分割に失敗し、すでにコンテンツがアップロードされている範囲にパーツをアップロードしようとしたことが原因です。アプリケーションでは、この最後のパーツがセッションに継続されなかったと想定する必要があります。
並行アップロード
パーツは並行してアップロードできますが、可能な限り順番にアップロードするようにしてください。バイトオフセッ トが小さいパーツは、バイトオフセットが大きいパーツより先にアップロードする必要があります。
推奨されるのは、バイトオフセット順に並べたパーツのキューから、3~5個のパーツを並行してアップロードする方法です。パーツのアップロードが失敗した場合は、さらにパーツをアップロードする前に、失敗したアップロードを再試行してください。