Javascript multer-req.file始终未定义

Javascript multer-req.file始终未定义,javascript,node.js,express,multer,Javascript,Node.js,Express,Multer,对于同一个问题,我已经看了很多答案,但我还没有找到有效的解决方案。我正在尝试制作一个web应用程序,您可以使用express和multer将文件上载到,但我遇到了一个问题,即没有上载任何文件,并且req.file始终未定义 下面是我的代码 'use strict'; var express = require('express'); var path = require('path'); var multer = require('multer') var upload = mult

对于同一个问题,我已经看了很多答案,但我还没有找到有效的解决方案。我正在尝试制作一个web应用程序,您可以使用express和multer将文件上载到,但我遇到了一个问题,即没有上载任何文件,并且req.file始终未定义

下面是我的代码

'use strict';

var express = require('express');
var path    = require('path');
var multer  = require('multer')
var upload  = multer({ dest: 'uploads/' })

var app = express();
require('dotenv').load();

app.use(express.static(path.join(__dirname, 'main')));

app.post('/upload', upload.single('upl'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
  console.log(req.file);
  res.status(204).end();
})

var port = process.env.PORT || 8080;
app.listen(port,  function () {
    console.log('Node.js listening on port ' + port + '...');
});
形式

    <form class="uploadForm" action="/upload" method="post" enctype="multipart/formdata">
        <label class="control-label">Select File</label>
        <input name="upl" id="input-1" type="file" class="file">
        <input type="submit" value="submit" />
    </form>

选择文件

非常感谢您的帮助,这让我快疯了。

您的
enctype
有点不正确,应该是
多部分/表单数据
而不是
多部分/表单数据

如果是邮递员,请尝试以下操作:

  • 关闭API的“邮递员”选项卡
  • 再次打开新选项卡
  • 重新生成API请求,然后发送
  • 这可能会解决问题。每次重新启动服务器时,都需要执行上述步骤以再次调用API。原因是multer将一些名为connect.sid的Cookie发送回客户端,以便进一步通信。使用旧的cookies不会上传文件。

    我把我的(有很多我想象的,当然更好的)解决方案,以帮助许多像我这样的人,因为我已经搜索了一整天-(



    HTML文件,

    <form class="uploadForm" action="/upload" method="post" enctype="multipart/form-data">
        <label class="control-label">Select File</label>
        <input name="upl" id="input-1" type="file" class="file">
        <input type="submit" value="submit" />
    </form>
    

    是的,您的
    enctype
    是错误的,这是唯一的问题。请确保更正您的enctype,否则您可能会在req.file或req.files中未定义。

    对于我们来说,这是因为我们使用
    express http proxy
    在multer之前代理调用,我们需要使用
    parseReqBody:false
    选项以正确发送文件


    大家好,我也浪费了24小时,并得到了相同的错误,即req.file未定义。现在,您可以参考下面的代码来检查您的解决方案。这是使用节点和邮递员中的multer上传文件的单文件演示代码。在邮递员中选择POST方法并选择表单数据,键名应为“profile”

    var express = require('express');
    const app = express();
    const port = 3000;
    var multer = require('multer');
    var upload = multer({dest:'uploads/'});
    var storage = multer.diskStorage({
        destination: function(req, file, cb) {
            cb(null, './uploads');
         },
        filename: function (req, file, cb) {
            cb(null , file.originalname);
        }
    });
    var upload = multer({ storage: storage })
    
    app.post('/single', upload.single('profile'), (req, res, error) => {
        try {
          console.log(req.file);
          res.send(req.file);
        }catch(err) {
          res.send(400);
        }
      });
    app.get('/', (req, res) => {
        res.send('hello Guys');
    });
    app.listen(port, () => {
        console.log('listening to the port: ' + port);
    });
    

    如果您正在使用中提到的错误处理,那么req.file将是未定义的

    使用错误处理和检查文件是否存在的另一种方法是使用快速错误处理:

    index.js

    var express=require("express");
    var multer=require("multer");
    var app=express();
    var upload=multer({dest:"uploads/"});
    app.post("/upload",upload.single("upl"),function(req,res){
    console.log("Uploaded Successfull with filename : "+req.upl.filename);
    });
    
    const express = require("express");
    const bodyParser = require("body-parser");
    const upload = require("./upload");
    const multer = require("multer");
    
    const app = express();
    
    app.use(bodyParser.urlencoded({ extended: true }));
    
    app.get("/", function (req, res) {
      res.send("Hello World");
    });
    
    app.post("/upload_file", upload.single("file"), function (req, res) {
      if (!req.file) {
        throw Error("FILE_MISSING");
      } else {
        res.send("success");
      }
    });
    
    //Express Error Handling
    app.use(function (err, req, res, next) {
      if (err instanceof multer.MulterError) {
        res.statusCode = 400;
        res.send(err.code);
      } else if (err) {
        if (err.message === "FILE_MISSING") {
          res.statusCode = 400;
          res.send("FILE_MISSING");
        } else {
          res.statusCode = 500;
          res.send("GENERIC_ERROR");
        }
      }
    });
    
    const server = app.listen(8081, function () {
      const port = server.address().port;
    
      console.log("App started at http://localhost:%s", port);
    });
    
    const multer = require("multer");
    const storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, "./uploads");
      },
      filename: function (req, file, cb) {
        cb(null, Date.now() + "_" + file.originalname);
      },
    });
    
    const upload = multer({
      storage: storage,
      //   limits: { fileSize: 10 },
    });
    
    module.exports = upload;
    
    upload.js

    var express=require("express");
    var multer=require("multer");
    var app=express();
    var upload=multer({dest:"uploads/"});
    app.post("/upload",upload.single("upl"),function(req,res){
    console.log("Uploaded Successfull with filename : "+req.upl.filename);
    });
    
    const express = require("express");
    const bodyParser = require("body-parser");
    const upload = require("./upload");
    const multer = require("multer");
    
    const app = express();
    
    app.use(bodyParser.urlencoded({ extended: true }));
    
    app.get("/", function (req, res) {
      res.send("Hello World");
    });
    
    app.post("/upload_file", upload.single("file"), function (req, res) {
      if (!req.file) {
        throw Error("FILE_MISSING");
      } else {
        res.send("success");
      }
    });
    
    //Express Error Handling
    app.use(function (err, req, res, next) {
      if (err instanceof multer.MulterError) {
        res.statusCode = 400;
        res.send(err.code);
      } else if (err) {
        if (err.message === "FILE_MISSING") {
          res.statusCode = 400;
          res.send("FILE_MISSING");
        } else {
          res.statusCode = 500;
          res.send("GENERIC_ERROR");
        }
      }
    });
    
    const server = app.listen(8081, function () {
      const port = server.address().port;
    
      console.log("App started at http://localhost:%s", port);
    });
    
    const multer = require("multer");
    const storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, "./uploads");
      },
      filename: function (req, file, cb) {
        cb(null, Date.now() + "_" + file.originalname);
      },
    });
    
    const upload = multer({
      storage: storage,
      //   limits: { fileSize: 10 },
    });
    
    module.exports = upload;
    

    如果您让postman使用POST方法打开,并且一些x-www-form-Url编码的更改表单数据在您关闭选项卡并打开一个新的+1之前不会发送多部分/表单数据,则此答案非常有价值。谢谢。开放问题仅供参考,非常感谢!我一直在绞尽脑汁想这为什么不起作用!您收到此问题了吗?我挣扎着Multer只接受多部分/表单数据的内容类型,但我的客户端拥有这一权利,它仍然无法工作……在我的情况下,Multer无法解析客户端(Java服务器)设置的请求体中的多部分表单数据/边界。我的解决方案是使用wireshark并检查请求正文。我将结果与邮递员创建的请求进行了比较…我需要调整一些CRLF,但由于任何原因,Multer都不接受所使用的边界。我使用邮递员生成的边界,然后它工作了。。。