如何实现向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
相关产品推荐
相关产品推荐

