【问题标题】:Req.file is undefined when uploaded from ReactJS to NodeJS从 ReactJS 上传到 NodeJS 时,Req.file 未定义
【发布时间】:2019-06-27 00:29:55
【问题描述】:

我正在尝试从响应 nodejs 的 POST 请求中发送图像。但是我的后端没有收到文件并且 req.file 是未定义的。当我用邮递员测试服务器图像上传代码时,一切正常,所以我怀疑前端有问题。有人知道出了什么问题吗? 这是我的代码:

Image_Upload.js(提交图片函数,fileList[0]为图片):

 onSubmitImage = e => {
    const config = {
      headers: {
        "content-type": "multipart/form-data"
      }
    };
    const formData = new FormData();
    formData.append(
      "image",
      this.state.fileList[0]
    );
    axios
      .post("/api/profile/img_upload", formData)
      .then(res => console.log("Response: " + res))
      .catch(err => console.log(err.response.data));
  };

profile.js(接收图片端点):

router.post(
  "/img_upload",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    upload(req, res, err => {
      console.log(req);
      if (err) {
        res.status(400).json({ Error: err });
      } else {
        if (req.file == undefined) {
          res.status(404).json({ error: "no file selected" });
        } else {
          res.json({ fileLoc: req.file.location });
        }
      }
    });
  }
);

img_upload.js(多重设置):

const upload = multer({
  storage: storage,
  limits: { fileSize: 1000000 },
  fileFilter: function(req, file, cb) {
    checkFileType(file, cb);
  }
}).single("image");

感谢任何帮助

编辑: 我注意到当nodejs从前端接收req时,它在req.body而不是req.file中。所以我很肯定问题在于反应。我怎样才能做出反应以将其作为 req.file 而不是 req.body 发送? Image request from Reacdt Front-end to Nodejs backend

【问题讨论】:

  • 什么是fileList[0]
  • 这是数组的第一个图像,图像肯定不是未定义的
  • 删除内容类型标头
  • 删除内容类型标头无效

标签: javascript node.js reactjs api multipartform-data


【解决方案1】:

您定义的upload 实际上是一个express middleware,它必须接受3 个参数:分别是请求、响应和下一个。 next() 在没有错误的情况下调用后续的中间件或next(error) 否则。我强烈建议检查the answers to this question 以获得更好的想法。

您在这里所做的是调用中间件,就好像它是一个方法一样。要解决这个问题,请先配置 multer

const multer  = require('multer');
const upload = multer({
  storage: 'path/here/',
  limits: { fileSize: 1000000 },
  fileFilter: function(req, file, cb) {
    checkFileType(file, cb);
  }
});

然后

router.post("/img_upload",
  passport.authenticate("jwt", { session: false }),
  upload.single('image'),
  (req, res) => {
  // Your code here
});

【讨论】:

  • 谢谢,这个解决方案与邮递员一起工作,但是当从反应前端发送图像时,req.file 仍然未定义。我在帖子中添加了请求的屏幕截图
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
相关资源
最近更新 更多