You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dropbox API的filesUploadSessionAppendV2上传大文件时遇concurrent_session_invalid_data_size错误

解决Dropbox API filesUploadSessionAppendV2 报 concurrent_session_invalid_data_size 错误

问题根源

你的代码存在两个核心问题,导致Dropbox API返回该错误:

  1. 未获取实际读取字节数:readBytes函数忽略了fs.read回调返回的实际读取字节数,仅通过循环索引计算bytesRead,导致最后一块数据长度计算偏差,上传时实际发送的chunk大小与Dropbox预期的offset不匹配。
  2. 最后一块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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:25:47