使用Dropbox API的filesUploadSessionAppendV2上传大文件时遇concurrent_session_invalid_data_size错误
解决Dropbox API
filesUploadSessionAppendV2 报 concurrent_session_invalid_data_size 错误 问题根源
你的代码存在两个核心问题,导致Dropbox API返回该错误:
- 未获取实际读取字节数:
readBytes函数忽略了fs.read回调返回的实际读取字节数,仅通过循环索引计算bytesRead,导致最后一块数据长度计算偏差,上传时实际发送的chunk大小与Dropbox预期的offset不匹配。 - 最后一块chunk长度计算错误:依赖索引计算的理论值判断长度,而非实际读取的字节数,进一步加剧了数据大小不匹配问题。
修复后的代码
const fs = require('fs'); // 修复:返回实际读取的字节数 function readBytes(fd, sharedBuffer) { return new Promise((resolve, reject) => { fs.read(fd, sharedBuffer, 0, sharedBuffer.length, null, (err, bytesRead) => { if (err) return reject(err); resolve(bytesRead); }); }); } async function* generateChunks(filePath, size) { const sharedBuffer = Buffer.alloc(size); const stats = fs.statSync(filePath); const fd = fs.openSync(filePath); let totalBytesRead = 0; while (totalBytesRead < stats.size) { const bytesRead = await readBytes(fd, sharedBuffer); totalBytesRead += bytesRead; const chunkLength = totalBytesRead > stats.size ? stats.size - (totalBytesRead - bytesRead) : bytesRead; yield [ sharedBuffer.slice(0, chunkLength), { bytesRead: totalBytesRead, size: stats.size, done: totalBytesRead >= stats.size }, ]; } fs.closeSync(fd); // 关闭文件描述符避免资源泄漏 } // 确保CHUNK_SIZE是4MB的精确整数倍 const CHUNK_SIZE = 40 * 1024 * 1024; // 初始化上传会话 const { result: { session_ids } } = await client.filesUploadSessionStartBatch({ num_sessions: 1 }); const session_id = session_ids[0]; // 分块上传 const src = "file.zip"; let offset = 0; for await (const [chunk, progress] of generateChunks(src, CHUNK_SIZE)) { await client.filesUploadSessionAppendV2({ contents: chunk, cursor: { session_id, offset, }, close: progress.done, }); // 按实际chunk长度更新offset offset += chunk.length; } // 完成上传会话 await client.filesUploadSessionFinishBatchV2({ entries: [ { cursor: { session_id, offset }, commit: { path: "/file.zip", mode: "add", autorename: true } } ] });
关键改动说明
- 修正字节数获取:
readBytes返回实际读取的字节数,确保chunk长度计算精准。 - 重构分块逻辑:用循环替代索引遍历,基于实际读取字节数计算chunk长度,添加文件资源释放逻辑。
- 统一单位标准:改用
1024*1024定义CHUNK_SIZE,保证是4MB的精确倍数(Dropbox要求分块大小必须为4MB整数倍)。 - 同步offset计算:直接累加当前chunk的实际长度,确保与Dropbox服务器记录的offset完全匹配。
内容的提问来源于stack exchange,提问作者cgenco
相关产品推荐
相关产品推荐

