不正なコードを報告
コピー
AIに質問
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を超える場合、分割アップロード機能を使用して、大きいファイルのアップロードの信頼性を高めます。
