Dropbox SDK for DotNetで300MBを超えるファイルをアップロードする

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のファイルサイズの上限サイズのファイルまでアップロードすることができるようになります。