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