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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:27:31