Node.js服务端如何将表单上传的FormData文件正确写入磁盘
报错原因
"The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of File"
这个报错是因为Node.js原生的fs.writeFile方法不支持直接写入FormData解析后得到的File类型对象,只接受字符串、Buffer等类型的输入,你需要先把拿到的File对象转为Buffer再写入磁盘。
修正后的服务端代码
const fs = require('fs/promises'); // 使用promise版本的fs更方便处理异步逻辑 router.post("/upload", async (req, res) => { try { const fileKeys = Object.keys(req.files); if (!fileKeys.length) { return res.status(400).send('未上传任何文件'); } const targetFile = req.files[fileKeys[0]]; // 把File对象转成ArrayBuffer,再转成Node.js可用的Buffer类型 const fileBuffer = Buffer.from(await targetFile.arrayBuffer()); // 写入文件,建议自定义存储路径,不要直接用上传的文件名防止重名覆盖 const savePath = `./upload/${targetFile.name}`; await fs.writeFile(savePath, fileBuffer); res.status(200).send('文件上传成功'); } catch (err) { console.error('文件保存失败:', err); res.status(500).send('文件保存失败'); } });
额外注意事项
- 提前手动创建好存储文件的目录(比如上面代码里的
./upload文件夹),否则写入时会触发路径不存在的报错 - 如果同时上传多个文件,遍历
req.files的所有值依次处理即可 - 生产环境建议给存储的文件名加随机前缀或者用时间戳命名,避免不同用户上传同名文件导致覆盖
- 如果你使用的是Express框架,要确保已经配置了正确的FormData解析中间件(比如
express-fileupload或者multer),否则req.files会是undefined
内容的提问来源于stack exchange,提问作者derty14
相关产品推荐
相关产品推荐

