Node中如何使用fs将Multer接收的FormData图片文件保存到本地
错误原因
你调用pipe方法失败的核心原因是:files[0].buffer是Node.js原生的Buffer对象,不是可读流实例,本身没有pipe方法,所以会报错。同时你当前的控制器方法参数写法有误,multer解析后的文件列表是挂载在Express请求对象req.files上,不能直接作为控制器方法的入参。
方案1:直接写入Buffer(最简便,推荐)
你已经拿到了完整的文件Buffer,不需要用流,直接调用fs.writeFile方法写入即可,注意要提前确保uploads目录存在:
import * as fs from 'fs'; import * as path from 'path'; import { Response } from 'express'; public saveImage(req: any, res: Response) { const files = req.files; console.log("OtherServiceLocal saveImage - files :"); console.log(files[0]); // 自动创建uploads目录,recursive设为true时多级目录不存在也会自动生成 const uploadDir = path.join(__dirname, './uploads'); if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } const targetPath = path.join(uploadDir, 'image.png'); // 直接写入Buffer fs.writeFile(targetPath, files[0].buffer, (err) => { if (err) { console.error('保存文件失败:', err); return res.status(500).send('文件保存失败'); } res.status(200).send('文件保存成功'); }); }
方案2:Buffer转可读流后pipe(适合需要流式处理的场景)
如果你确实需要用流的方式处理(比如后续要做分片处理、转存到对象存储等),可以用Node.js内置的stream.Readable把Buffer转为可读流,再执行pipe操作:
import * as fs from 'fs'; import * as path from 'path'; import { Response } from 'express'; import { Readable } from 'stream'; public saveImage(req: any, res: Response) { const files = req.files; const uploadDir = path.join(__dirname, './uploads'); if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } const writeStream = fs.createWriteStream(path.join(uploadDir, 'image.png')); // 将Buffer转为可读流 const readStream = Readable.from(files[0].buffer); readStream.pipe(writeStream); readStream.on('error', (err) => { console.error('读流错误:', err); res.status(500).send('文件保存失败'); }); writeStream.on('finish', () => { res.status(200).send('文件保存成功'); }); writeStream.on('error', (err) => { console.error('写流错误:', err); res.status(500).send('文件保存失败'); }); }
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

