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

如何基于NestJS和streamifier实现Cloudinary多文件上传?

实现Cloudinary多文件上传

你需要在现有服务中新增批量上传方法,利用Promise.all并行处理多文件上传请求,同时确保Multer中间件配置正确以接收文件数组。

修改后的CloudinaryService代码

@Injectable()
export class CloudinaryService {
  // 保留原单文件上传方法
  uploadFile(file: Express.Multer.File): Promise<CloudinaryResponse> {
    return new Promise<CloudinaryResponse>((resolve, reject) => {
      const uploadStream = cloudinary.uploader.upload_stream(
        { folder: "FupartmentStore" },
        (error, result) => {
          if (error) return reject(error);
          resolve(result);
        }
      );

      streamifier.createReadStream(file.buffer).pipe(uploadStream);
    });
  }

  // 新增多文件上传方法
  uploadFiles(files: Express.Multer.File[]): Promise<CloudinaryResponse[]> {
    // 遍历文件数组,为每个文件生成上传Promise,并行执行
    const uploadTasks = files.map(file => this.uploadFile(file));
    return Promise.all(uploadTasks);
  }
}

关键细节说明

  • 并行上传逻辑:Promise.all会同时发起所有文件的上传请求,相比串行上传能显著提升效率。如果需要避免触发Cloudinary的频率限制,可改用Promise.allSettled实现容错上传(允许部分文件失败):

    async uploadFiles(files: Express.Multer.File[]): Promise<CloudinaryResponse[]> {
      const uploadResults = await Promise.allSettled(files.map(file => this.uploadFile(file)));
      // 过滤并提取成功的上传结果
      return uploadResults
        .filter(item => item.status === 'fulfilled')
        .map(item => (item as PromiseFulfilledResult<CloudinaryResponse>).value);
    }
    
  • Multer配置要求:必须在路由中配置正确的Multer拦截器以接收文件数组,示例如下:

    // 在控制器路由中使用FilesInterceptor
    @Post('batch-upload')
    @UseInterceptors(FilesInterceptor('files', 10)) // 'files'为前端表单字段名,10为最大上传数
    async batchUpload(@UploadedFiles() files: Express.Multer.File[]) {
      return this.cloudinaryService.uploadFiles(files);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:04:56