Unhandled exception. Dropbox.Api.ApiException`1[Dropbox.Api.Files.UploadError]: payload_too_large/..
というエラーが見た方向けの記事です。
client.Files.UploadAsync
メソッドでは、300MB以下のファイルしかアップロードできません。
(ドキュメントを読むと、150MB以上は保証されないらしい)
ある日突然、対象のファイルが300MBを超えて上記エラーが出た時にどのように修正すれば良いか。
300MBを超えるファイルをアップロードするには client.Files.UploadAsync
ではなく client.Files.UploadSession
を使い、チャンクに分けてアップロードします。
ドキュメント /upload_session/start
.netでの呼び出し方はテストコードを参考に、
await client.Files.UploadAsync(uploadPath, body: stream);
↓
const int chunkSize = 100 * 1024 * 1024; // 100MB var numChunks = (int) Math.Ceiling((double) stream.Length / chunkSize); var buffer = new byte[chunkSize]; string sessionId = null; for (var idx = 0; idx < numChunks; idx++) { var byteRead = await stream.ReadAsync(buffer, 0, chunkSize); using (var memoryStream = new MemoryStream(buffer, 0, byteRead)) { if (idx == 0) { var result = await client.Files.UploadSessionStartAsync(body: memoryStream); sessionId = result.SessionId; } else { var cursor = new UploadSessionCursor(sessionId, (ulong) (chunkSize * idx)); if (idx == numChunks - 1) { await client.Files.UploadSessionFinishAsync(cursor, new CommitInfo(uploadPath), memoryStream); } else { await client.Files.UploadSessionAppendV2Async(cursor, body: memoryStream); } } } }
これで本来のDropboxのファイルサイズの上限サイズのファイルまでアップロードすることができるようになります。