メインコンテンツへスキップ
アプリケーションによっては、1つのフォルダのすべてのファイルをアップロードできる場合もあります。SDKとCLIを使用してこの処理を実行するには、フォルダツリー内を移動してすべてのファイルを探し、そのファイルをアップロードする必要があります。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Dynamic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Box.V2;
using Box.V2.Auth;
using Box.V2.Config;
using Box.V2.Converter;
using Box.V2.Exceptions;
using Box.V2.JWTAuth;
using Box.V2.Models;
using Newtonsoft.Json;

namespace BoxPlayground {
    public class Program {
        static void Main (string[] args) {
            ExecuteMainAsync ().Wait ();
        }
        const long CHUNKED_UPLOAD_MINIMUM = 200000;
        private static async Task ExecuteMainAsync () {
            var directoryName = "dotnetUploadFolder";
            var parentFolderId = "0";
            var files = Directory.EnumerateFiles (directoryName);
            using (FileStream fs = new FileStream ("./config.json", FileMode.Open)) {
                var session = new BoxJWTAuth (BoxConfig.CreateFromJsonFile (fs));
                var client = session.AdminClient (session.AdminToken ());
                var folderId = "";
                try {
                    var createdFolder = await client.FoldersManager.CreateAsync (
                        new BoxFolderRequest {
                            Parent = new BoxRequestEntity {
                                    Id = parentFolderId
                                },
                                Name = directoryName
                        });
                    folderId = createdFolder.Id;
                } catch (BoxConflictException<BoxFolder> e) {
                    folderId = e.ConflictingItems.FirstOrDefault ().Id;
                    System.Console.WriteLine ($"Found existing folder: {folderId}");
                }
                var fileUploadTasks = new List<Task<BoxFile>> ();
                foreach (var file in files) {
                    fileUploadTasks.Add (Task.Run (
                        async () => {
                            System.Console.WriteLine (file);
                            var fileName = file.Split (Path.DirectorySeparatorChar)
                                .Where ((item) => { return item != directoryName; }).FirstOrDefault ();
                            System.Console.WriteLine (fileName);
                            var fileInfo = new FileInfo (file);
                            var preflightRequest = new BoxPreflightCheckRequest {
                                Name = fileName,
                                Size = fileInfo.Length,
                                Parent = new BoxRequestEntity {
                                Id = folderId
                                }
                            };
                            using (FileStream toUpload = new FileStream (file, FileMode.Open)) {
                                try {
                                    var preflightCheck = await client.FilesManager.PreflightCheck (preflightRequest);
                                    if (toUpload.Length < CHUNKED_UPLOAD_MINIMUM) {
                                        using (SHA1 sha1 = SHA1.Create ()) {
                                            var fileUploadRequest = new BoxFileRequest {
                                            Name = fileName,
                                            Parent = new BoxRequestEntity {
                                            Id = folderId
                                            }
                                            };
                                            var fileSHA = sha1.ComputeHash (toUpload);
                                            System.Console.WriteLine (fileSHA);
                                            return await client.FilesManager.UploadAsync (fileRequest: fileUploadRequest, stream: toUpload, contentMD5: fileSHA);
                                        }
                                    } else {
                                        return await client.FilesManager.UploadUsingSessionAsync (stream: toUpload, fileName: fileName, folderId: folderId);
                                    }
                                } catch (BoxPreflightCheckConflictException<BoxFile> e) {
                                    if (toUpload.Length < CHUNKED_UPLOAD_MINIMUM) {
                                        using (SHA1 sha1 = SHA1.Create ()) {
                                            var fileSHA = sha1.ComputeHash (toUpload);
                                            return await client.FilesManager.UploadNewVersionAsync (fileName: e.ConflictingItem.Name, fileId: e.ConflictingItem.Id, stream: toUpload, contentMD5: fileSHA);
                                        }
                                    } else {
                                        await client.FilesManager.UploadFileVersionUsingSessionAsync (fileId: e.ConflictingItem.Id, stream: toUpload);
                                        return await client.FilesManager.GetInformationAsync (e.ConflictingItem.Id);
                                    }
                                }
                            }

                        }));
                }

                var uploaded = await Task.WhenAll (fileUploadTasks);
                foreach (var file in uploaded) {
                    System.Console.WriteLine (file.Id);
                }
            }
        }
    }
}

解説

上のスクリプトは、Box SDKとCLIを使用してフォルダ全体をアップロードします。このSDKスクリプトでは、最初にローカルフォルダに対応するディレクトリをBox内に作成します。 新しいディレクトリが作成されたら、ディレクトリ内のすべてのファイルをアップロードし、利用可能なすべてのBox機能を使用してアップロードを確実に成功させます。 アップロードの前に、事前チェックAPIを使用してファイルの競合とサイズ制限をチェックします。名前の競合が見つかった場合、代わりにそのファイルの新しいバージョンをアップロードします。 ファイルのSHAハッシュを使用して、アップロード時にcontent-md5ヘッダーを追加することで、ファイルのデータが失われたり改変されたりすることなくBoxに正常にアップロードされるようにします。 最後に、ファイルサイズが20 MBを超える場合、分割アップロード機能を使用して、大きいファイルのアップロードの信頼性を高めます。