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

使用Multer在Heroku博客中上传MongoDB头像遇问题求助

问题排查与解决方案

1. 解决「ENOENT: no such file or directory」错误

Multer不会自动创建目标存储目录,必须确保./uploads目录存在:

  • 手动在项目根目录创建uploads文件夹;
  • 或者在Multer配置中用Node.js的fs模块自动创建目录(避免部署时遗漏):
const fs = require('fs');
const path = require('path');

const storage = multer.diskStorage({
  destination: function(req, file, cb){
    const uploadDir = path.join(__dirname, './uploads');
    // 递归创建目录,不存在则自动生成层级
    fs.mkdirSync(uploadDir, { recursive: true });
    cb(null, uploadDir);
  },
  filename : function(req, file, cb){
    cb(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);
  }
});

2. 确保文件能正常上传保存

前端表单必须设置enctype="multipart/form-data"编码类型,否则文件无法被Multer解析:

<form action="/profilepic" method="POST" enctype="multipart/form-data">
  <input type="file" name="image" />
  <button type="submit">上传头像</button>
</form>

3. 修正头像存储逻辑的矛盾

你的User Schema中profileImg定义为Buffer类型,但代码里试图存入req.body.filename,这是逻辑错误,需二选一调整:

选项A:存储文件路径(更常用)

修改Schema的profileImg类型为String:

profileImg: String, // 存储文件相对路径

更新逻辑中存入文件的相对路径:

app.post("/profilepic", upload.single("image"), (req, res)=>{
  if (!req.file) {
    return res.redirect("/settings?error=请选择图片");
  }
  // 拼接文件相对路径,用于后续读取
  const imgPath = path.join('uploads', req.file.filename);
  User.updateOne({_id: req.user._id}, {$set:{profileImg: imgPath}}, (err)=>{
    if(err){
      console.log(err);
      res.redirect("/settings?error=上传失败");
    } else {
      res.redirect("/settings")
    }
  })
});

选项B:存储文件Buffer(不推荐,会增大数据库体积)

若坚持用Buffer存储,需读取上传后的文件内容:

app.post("/profilepic", upload.single("image"), (req, res)=>{
  if (!req.file) {
    return res.redirect("/settings?error=请选择图片");
  }
  // 读取文件为Buffer格式
  const imgBuffer = fs.readFileSync(req.file.path);
  User.updateOne({_id: req.user._id}, {$set:{profileImg: imgBuffer}}, (err)=>{
    if(err){
      console.log(err);
      res.redirect("/settings?error=上传失败");
    } else {
      // 可选:删除本地临时文件
      fs.unlinkSync(req.file.path);
      res.redirect("/settings")
    }
  })
});

4. 额外调试建议

  • 若req.file打印为undefined,检查前端表单的文件输入框name属性是否与upload.single("image")的字段名一致;
  • 确认req.user._id能正确获取当前登录用户ID,否则更新操作不会生效。

内容的提问来源于stack exchange,提问作者David Val

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:15:52