如何将FormData接收的文件保存到本地?解决arrayBuffer报错问题
问题解决:Node.js + Formidable 实现文件本地存储
错误原因
你遇到的arrayBuffer不是函数报错,是因为Formidable解析返回的文件对象并非浏览器环境中的Blob/File对象,它没有arrayBuffer()方法。Formidable会自动将上传文件保存到系统临时目录,返回的文件对象包含临时文件路径(filepath)、原文件名(originalFilename)等核心属性。
另外你的代码存在异步逻辑错误:res.send(file.name)写在form.parse回调外部,由于form.parse是异步操作,执行这行代码时file还未被赋值,会触发未定义错误,必须把响应逻辑放在回调内部。
修正后的代码
const fs = require('fs'); const path = require('path'); const formidable = require('formidable'); // 确保目标目录存在,不存在则自动创建 fs.mkdirSync('./files', { recursive: true }); app.post('/api/upload/media', (req, res) => { const form = new formidable.IncomingForm(); // 可选:保留文件扩展名,方便后续识别文件类型 form.keepExtensions = true; form.parse(req, (err, fields, files) => { if (err) { return res.status(400).json({ message: "图片上传失败" }); } // 假设前端上传的文件字段名为media,根据实际情况调整 const uploadedFile = files.media; if (!uploadedFile) { return res.status(400).json({ message: "未上传任何文件" }); } // 构建目标保存路径 const targetPath = path.join(__dirname, './files', uploadedFile.originalFilename); // 方式1:直接移动临时文件到目标路径(高效推荐) fs.rename(uploadedFile.filepath, targetPath, (err) => { if (err) { console.error(err); return res.status(500).json({ message: "文件保存失败" }); } res.json({ message: "文件上传成功", filename: uploadedFile.originalFilename }); }); // 方式2:读取文件内容后写入(适合需要修改文件内容的场景) // fs.readFile(uploadedFile.filepath, (err, buffer) => { // if (err) { // console.error(err); // return res.status(500).json({ message: "读取文件失败" }); // } // fs.writeFile(targetPath, buffer, (err) => { // if (err) { // console.error(err); // return res.status(500).json({ message: "文件保存失败" }); // } // // 读取完成后删除临时文件 // fs.unlink(uploadedFile.filepath, (err) => { // if (err) console.error(err); // }); // res.json({ // message: "文件上传成功", // filename: uploadedFile.originalFilename // }); // }); // }); }); });
注意事项
- 如果是跨磁盘分区移动文件,
fs.rename可能失败,此时可以改用fs.copyFile完成文件复制,之后再删除临时文件。 - 若需处理多文件上传,遍历
files对象中的每个文件即可。 - 可以通过
form.uploadDir自定义临时文件存储目录,避免默认临时目录可能存在的清理问题。
内容的提问来源于stack exchange,提问作者Nitish Kumar
相关产品推荐
相关产品推荐

