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

如何实现向Google Cloud Storage批量并行上传文件?

实现Google Cloud Storage(GCS)批量文件并行上传与文件夹清理

你的核心需求是将串行上传改为并行上传来提升性能,待所有文件上传完成后再清理临时文件夹。原代码的问题在于循环中使用await,导致上传任务逐个串行执行,无法利用并行处理的优势。

解决方案:使用Promise.all实现并行上传

通过将所有上传任务包装成Promise,再用Promise.all等待所有任务完成,就能实现批量并行上传。之后再统一执行文件和文件夹的删除操作,避免中途误删。

修改后的代码示例:

// 1. 收集所有上传任务的Promise(不立即await,实现并行)
const uploadPromises = files.map(async (fileName) => {
  const fsPath = `${outputFolderPath}/${fileName}`;
  const videoFullPath = `${uuid}/${fileName}`;
  
  // 执行上传,这里的await只作用于单个Promise内部,不阻塞其他任务
  await CloudStorage.op().uploadFile(
    `./${fsPath}`,
    file.mimetype,
    videoFullPath,
    bucket,
  );
  
  // 上传成功后立即删除单个文件,也可以统一在最后删文件夹
  fs.unlinkSync(fsPath);
});

try {
  // 2. 等待所有上传任务全部完成
  await Promise.all(uploadPromises);
  
  // 3. 所有上传完成后,删除空文件夹
  fs.rmdirSync(outputFolderPath);
} catch (error) {
  // 处理上传失败的情况,比如记录错误、避免误删文件
  console.error("部分文件上传失败:", error);
  // 根据业务需求决定是否保留临时文件,或清理已上传成功的文件
}

关键注意事项

  • 并发限制:如果文件数量极大(比如上千个),直接用Promise.all发起全部请求可能触发GCS的并发限流。可以将文件分成批次,比如每20个文件为一批,逐批执行Promise.all,避免被限流。
  • 错误处理:只要有一个上传任务失败,Promise.all就会抛出错误。需要在catch块中处理失败场景,比如记录失败的文件名、保留临时文件以便重试。
  • 文件夹删除优化:如果不需要逐个删除文件,也可以在所有上传完成后直接使用fs.rmSync(outputFolderPath, { recursive: true, force: true })递归删除整个文件夹,简化代码。

内容的提问来源于stack exchange,提问作者Pato P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:44:59