Box Developerドキュメント

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

詳細を表示

ファイルバージョンのアップロード

ガイド アップロード 直接アップロード ファイルバージョンのアップロード

ファイルバージョンのアップロード

直接アップロードによってBoxにファイルの新しいバージョンをアップロードするには、ファイルのコンテンツ、目的のファイル名、フォルダIDを使用して、POST /files/:id/content APIにAPIコールを実行します。

cURL
curl -i -X POST "https://upload.box.com/api/2.0/files/12345/content" \
     -H "authorization: Bearer <ACCESS_TOKEN>" \
     -H "content-type: multipart/form-data" \
     -F attributes='{"name":"Contract.pdf", "parent":{"id":"11446498"}}' \
     -F file=@<FILE_NAME>
TypeScript Gen
await client.uploads.uploadFileVersion(file.id, {
  attributes: {
    name: file.name!,
  } satisfies UploadFileVersionRequestBodyAttributesField,
  file: generateByteStream(20),
} satisfies UploadFileVersionRequestBody);
Python Gen
client.uploads.upload_file_version(
    file.id, UploadFileVersionAttributes(name=file.name), generate_byte_stream(20)
)
.NET Gen
await client.Uploads.UploadFileVersionAsync(fileId: file.Id, requestBody: new UploadFileVersionRequestBody(attributes: new UploadFileVersionRequestBodyAttributesField(name: NullableUtils.Unwrap(file.Name)), file: Utils.GenerateByteStream(size: 20)));
Java
BoxFile file = new BoxFile(api, "id");
FileInputStream stream = new FileInputStream("My File.txt");
file.uploadNewVersion(stream);
Python
file_id = '11111'
file_path = '/path/to/file.pdf'

updated_file = client.file(file_id).update_contents(file_path)
print(f'File "{updated_file.name}" has been updated')
.NET
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
    BoxFile file = await client.FilesManager
        .UploadNewVersionAsync("File v2.pdf", "11111", fileStream);
}
Node
var fs = require('fs');
var stream = fs.createReadStream('/path/to/file.pdf');
client.files.uploadNewFileVersion('11111', stream)
	.then(file => {
        /* file -> {
            total_count: 1,
            entries: 
            [ { type: 'file',
                id: '11111',
                file_version: 
                    { type: 'file_version',
                    id: '22222',
                    sha1: '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' },
                sequence_id: '0',
                etag: '0',
                sha1: '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33',
                name: 'My File.pdf',
                description: '',
                size: 68431,
                path_collection: 
                    { total_count: 1,
                    entries: 
                    [ { type: 'folder',
                        id: '0',
                        sequence_id: null,
                        etag: null,
                        name: 'All Files' } ] },
                created_at: '2017-05-16T15:18:02-07:00',
                modified_at: '2017-05-16T15:18:02-07:00',
                trashed_at: null,
                purged_at: null,
                content_created_at: '2017-05-16T15:18:02-07:00',
                content_modified_at: '2017-05-16T15:18:02-07:00',
                created_by: 
                    { type: 'user',
                    id: '33333',
                    name: 'Test User',
                    login: 'test@example.com' },
                modified_by: 
                    { type: 'user',
                    id: '33333',
                    name: 'Test User',
                    login: 'test@example.com' },
                owned_by: 
                    { type: 'user',
                    id: '33333',
                    name: 'Test User',
                    login: 'test@example.com' },
                shared_link: null,
                parent: 
                    { type: 'folder',
                    id: '0',
                    sequence_id: null,
                    etag: null,
                    name: 'All Files' }
                item_status: 'active' } ] }
        */
    })
iOS
let data = "updated file content".data(using: .utf8)
let task: BoxUploadTask = client.files.uploadVersion(
    forFile: "11111",
    name: "New file name.txt",
    contentModifiedAt: "2019-08-07T09:19:13-07:00",
    data: data
) { (result: Result<File, BoxSDKError>) in
    guard case let .success(file) = result else {
        print("Error uploading file version")
        return
    }

    print("New version of \(file.name) was uploaded")
}

// To cancel upload
if someConditionIsSatisfied {
    task.cancel()
}

事前チェック

アップロードしたファイルが拒否されることによる時間や帯域幅の無駄を防ぐため、ファイルをアップロードする前に事前チェックを実行することをお勧めします。

リクエスト形式

このAPIのリクエスト本文には、multipart/form-dataのコンテンツタイプが使用されます。これを使用して、ファイル属性とファイルの実際のコンテンツの2つの部分を送信します。

最初の部分はattributesと呼ばれ、ファイル名や親フォルダのidなど、ファイルに関する情報を含むJSONオブジェクトが含まれています。

以下の例では、ユーザーのルートフォルダにtest.txtをアップロードしています。

POST /api/2.0/files/123/content HTTP/1.1
Host: upload.box.com
Authorization: Bearer [ACCESS_TOKEN]
content-length: 343
content-type: multipart/form-data; boundary=------------------------9fd09388d840fef1
--------------------------9fd09388d840fef1
content-disposition: form-data; name="attributes"

{"name":"test.txt", "parent":{"id":"0"}}
--------------------------9fd09388d840fef1
content-disposition: form-data; name="file"; filename="test.txt"
content-type: text/plain

Test file text.
--------------------------9fd09388d840fef1--

マルチパート本文のattributes JSON部分は、マルチパートフォームデータのfile 部分の前に置く必要があります。この順番を間違えると、APIがHTTP 400ステータスコードとエラーコードmetadata_after_file_contentsを返します。

オプション

ファイルのアップロード時に使用できるすべてのパラメータの詳細については、このAPIコールに関するリファレンスドキュメントを参照してください。パラメータには、設定することで転送中のファイルの破損を防ぐcontent-md5や、アップロード時間とは異なる時間をファイル作成時間として明示的に指定できる機能が含まれます。

ファイルバージョンの場合、追加のif-matchヘッダーを渡すことで、アプリケーションが最後にコンテンツを検査した後で更新されたファイルが上書きされるのを防ぐことができます。

制約事項

直接アップロードできるファイルサイズの上限は50 MBです。ファイルがこれより大きい場合は、分割アップロードAPIを使用してください。

アップロードの上限は、認証済みユーザーのアカウントの種類によって決まります。詳細については、このトピックに関するBoxコミュニティの記事を参照してください。