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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:54:03