如何基于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
相关产品推荐
相关产品推荐

