BoxWorks 2024でコンテンツとAIの可能性について紹介します。

詳細を表示

ファイルの一部をアップロード

put
https://{box-upload-server}/api/2.0
/files/upload_sessions/:upload_session_id

アップロードセッションでファイルのチャンクをアップロードします。

実際のエンドポイントURLはCreate upload sessionおよびGet upload sessionエンドポイントが返します。

リクエスト

bearer [ACCESS_TOKEN]
application/octet-stream

パスパラメータ

stringパス内必須
D5E3F7A

アップロードセッションのID。

リクエスト本文

binary本文内必須

ファイルのバイナリコンテンツ

リクエストヘッダー

stringヘッダー内必須
bytes 8388608-16777215/445856194

チャンクのバイト範囲。

このセッションですでにアップロードされたパーツの範囲と重複しないようにしてください。各パーツのサイズは、作成したアップロードセッションで指定されているパーツサイズとまったく同じサイズである必要があります。ただし、ファイルの最後のパーツは小さくなる可能性があるため、例外となります。

content-rangeの値を指定する際は、以下の点に注意してください。

  • 各パーツのバイト範囲の下限は、パーツサイズの倍数にする必要があります。
  • 上限は、パーツサイズの倍数から1を引いた値にする必要があります。
stringヘッダー内必須
sha=fpRyg5eVQletdZqEKaFlqwBXJzM=

分割アップロードのRFC3230メッセージのダイジェスト。

サポートされているのはSHA1のみです。SHA1ダイジェストはbase64でエンコードされている必要があります。このヘッダーの形式は、sha=BASE64_ENCODED_DIGESTです。

SHAダイジェストの値を取得するには、openSSLコマンドを使用して、ファイルのパーツをエンコードします: openssl sha1 -binary <FILE_PART_NAME> | base64

レスポンス

チャンクは正常にアップロードされました。

チャンクがこれまでにアップロードされた別のチャンクと競合する場合は、エラーを返します。

前提条件を満たしていない場合は、エラーを返します。

コンテンツの範囲がセッションの指定範囲と一致しない場合は、エラーを返します。

予期しないクライアントエラー。

put
ファイルの一部をアップロード
このドキュメント内で一部のAPIを試せるようになりました。
ログイン

リクエストの例

cURL
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>
TypeScript Gen
await client.chunkedUploads.uploadFilePart(
  acc.uploadSessionId,
  generateByteStreamFromBuffer(chunkBuffer),
  {
    digest: digest,
    contentRange: contentRange,
  } satisfies UploadFilePartHeadersInput
);
Python Gen
client.chunked_uploads.upload_file_part(
    acc.upload_session_id,
    generate_byte_stream_from_buffer(chunk_buffer),
    digest,
    content_range,
)
.NET Gen
await client.ChunkedUploads.UploadFilePartAsync(uploadSessionId: acc.UploadSessionId, requestBody: Utils.GenerateByteStreamFromBuffer(buffer: chunkBuffer), headers: new UploadFilePartHeaders(digest: digest, contentRange: contentRange));
Java
//Reading a large file
FileInputStream fis = new FileInputStream("My_Large_File.txt");
//Create the digest input stream to calculate the digest for the whole file.
DigestInputStream dis = new DigestInputStream(fis, digest);

List<BoxFileUploadSessionPart> parts = new ArrayList<BoxFileUploadSessionPart>();

//Get the part size. Each uploaded part should match the part size returned as part of the upload session.
//The last part of the file can be less than part size if the remaining bytes of the last part is less than
//the given part size
long partSize = sessionInfo.getPartSize();
//Start byte of the part
long offset = 0;
//Overall of bytes processed so far
long processed = 0;
while (processed < fileSize) {
    long diff = fileSize - processed;
    //The size last part of the file can be less than the part size.
    if (diff < partSize) {
        partSize = diff;
    }

    //Upload a part. It can be uploaded asynchorously
    BoxFileUploadSessionPart part = session.uploadPart(dis, offset, (int)partSize, fileSize);
    parts.add(part);

    //Increase the offset and proceesed bytes to calculate the Content-Range header.
    processed += partSize;
    offset += partSize;
}
Python
upload_session = client.upload_session('11493C07ED3EABB6E59874D3A1EF3581')
offset = upload_session.part_size * 3
total_size = 26000000
part_bytes = b'abcdefgh'
part = upload_session.upload_part_bytes(part_bytes, offset, total_size)
print(f'Successfully uploaded part ID {part["part_id"]}')
Node
// Upload the part starting at byte offset 8388608 to upload session '93D9A837B45F' with part ID 'feedbeef'
client.files.uploadPart('93D9A837B45F', part, 8388608, 2147483648, {part_id: 'feedbeef'}, callback);

レスポンスの例

{
  "part": {
    "offset": 16777216,
    "part_id": "6F2D3486",
    "sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc",
    "size": 3222784
  }
}