Nodejs中req.files undefined 一般是有什么引起的呢?

Nodejs中req.files undefined 一般是有什么引起的呢?

我从网上找的方法都没解决问题 1、app.use(express.bodyParser()); 2、enctype=“multipart/form-data”

等等依然

app.post('/',function(req,res){
    console.log(req.files);
    console.log(req.body);
    console.log(req.query);
    console.log(req.params);
    console.log(req.form);
    res.end('ok');
})

undefined;


6 回复

Node.js 中 req.filesundefined 的常见原因及解决方法

当你在处理文件上传时遇到 req.filesundefined 的问题,这通常是由于以下几个原因导致的:

  1. 缺少必要的中间件:Express 默认并不支持处理文件上传。你需要使用专门的中间件,如 multerbusboy

  2. 表单编码类型不正确:确保你的表单的 enctype 属性设置为 multipart/form-data

  3. 请求未正确配置:确保你的前端表单或客户端请求正确地发送了文件数据。

示例代码及解释

以下是一个简单的示例,演示如何使用 multer 处理文件上传,并确保 req.files 正确获取到上传的文件信息。

  1. 安装 multer

    npm install multer
    
  2. 设置 multer 并在 Express 应用中使用它:

    const express = require('express');
    const multer = require('multer');
    
    const app = express();
    
    // 配置 Multer 存储引擎
    const storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, 'uploads/')  // 文件保存路径
      },
      filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now())  // 文件名
      }
    });
    
    const upload = multer({ storage: storage });
    
    // 定义一个 POST 路由来处理文件上传
    app.post('/upload', upload.single('file'), function (req, res, next) {
      try {
        console.log('Files:', req.file);  // 输出上传的文件信息
        console.log('Body:', req.body);  // 输出表单数据
        res.send('File uploaded successfully.');
      } catch (error) {
        next(error);
      }
    });
    
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    
  3. 前端 HTML 表单:

    <!DOCTYPE html>
    <html>
    <head>
      <title>File Upload</title>
    </head>
    <body>
      <form action="/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" />
        <button type="submit">Upload</button>
      </form>
    </body>
    </html>
    

在这个示例中,我们使用了 multer 来处理文件上传。multer.single('file') 中的 'file' 是表单中文件输入字段的名称。确保你的前端表单中的文件输入字段的 name 属性与此匹配。

通过以上步骤,你应该能够正确处理文件上传并获取到 req.files 的信息。


原来是把 app.use(express.bodyParser()); 放在 app.use(app.router); 前面就行了

话说…现在 express 不用 app.router 都能用verb ,为啥还这么写呢…

原来是这样的:

app.use(express.bodyParser({uploadDir:’./tmp’})); //一定要放在app.use(app.router);前面 app.use(app.router);

找了好久才找到原因。。。

谢谢!!!!

我的好像是 form 中的enctype = "mulitpart/form-data 写错了所有找不到req.files

当在 Node.js 中使用 req.files 时,如果发现它是 undefined,通常是因为没有正确配置文件上传中间件。常见的原因包括使用了不兼容的中间件或配置错误。

为了处理文件上传,你需要使用专门的中间件,如 multer。以下是使用 multer 的示例代码:

  1. 安装 multer
npm install multer
  1. 配置并使用 multer
const express = require('express');
const multer = require('multer');

const app = express();

// 设置 Multer 存储策略
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/') // 保存文件的目标目录
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now()) // 文件名
  }
});

const upload = multer({ storage: storage });

// 使用 Multer 处理文件上传
app.post('/upload', upload.single('file'), function (req, res, next) {
  // req.file 是单个文件的信息
  console.log(req.file);

  // req.body 将包含文本字段
  console.log(req.body);

  res.send('File uploaded successfully!');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在这个例子中:

  • upload.single('file') 表示处理一个名为 file 的单个文件。
  • req.file 包含了上传文件的信息。
  • req.body 包含了表单中的其他文本字段信息。

如果你使用的是老版本的 Express 并且想使用 body-parser,你需要用 multer 来替代它来处理文件上传,因为 body-parser 只能解析 JSON 和 URL 编码的数据。

回到顶部