使用Express.js进行多部分表单数据POST方法

6
我尝试将表单数据发布到我的express js服务器端。这是我的pug文件。
form(action="/profile" method="post" enctype="multipart/form-data")
 input(type="file" accept="image/*" name="profileimage")
 input(type="text" name="username")
 input(type="submit" value="Upload")

接着我尝试在服务器端js内使用req.body记录POST数据,如下所示。以下是我的 profile.js

router.post('/', function (req, res) {
  console.log('Body- ' + JSON.stringify(req.body));
});

以下是我的控制台结果:

body- {}

如果我不使用 enctype="multipart/form-data",而是像这样使用 form(action="/profile" method="post"),我就可以从我的控制台结果中获取提交的数据。


duplicate for https://dev59.com/W6nka4cB1Zd3GeqPNmvY#49030208 - Giannis Mp
2个回答

13

你需要使用一个中间件来处理多部分表单数据,我认为最著名的是multer

你可以在这里找到它:https://github.com/expressjs/multer

使用方法如下:

  1. 首先,在根项目中使用npm install --save multer来将其添加到你的模块中。

  2. 然后在你的.js文件中导入它:var multer = require('multer');

  3. 通过在multer构造函数中设置dest参数来选择你的上传目录:var upload = multer({ dest: 'uploads/' });

  4. 现在只需像以下代码一样将其作为中间件传递给你的POST函数:

    router.post('/', upload, function (req, res) {
      console.log('Body- ' + JSON.stringify(req.body));
    });
    

别忘了阅读他们在Github存储库的文档。


2
谢谢@Atef,但这会将数据分成req.file和req.body。请问有没有办法将所有内容都放在一个formData中的req.body中,以便我可以将数据原样发送到另一个API? - Vixson
@Vixson 我之前也遇到过同样的情况,我建议使用 formidable,因为它有一个更简单的处理程序,不会将请求分成 req.file 和 req.body。虽然它比 multer 大 4 倍,但在我看来仍然很轻巧。 - d0st

3

express-formidable模块最适合将post数据发送到服务器。 使用以下命令安装express-formidablenpm install express-formidable 以下是示例代码:

let express = require('express');
let app = express();
let formidable = require('express-formidable');
let path = require('path');

app.use(formidable({
  encoding: 'utf-8',
  uploadDir: path.join(__dirname, 'uploads'),
  multiples: true,
  keepExtensions: true// req.files to be arrays of files
}));

app.post('/uploads',function(req,res){
  console.log('Files '+JSON.stringify(req.files));// contains data about file fields
  console.log('Fields '+JSON.stringify(req.fields));//contains data about non-file fields
});

您需要在项目根目录中创建一个名为uploads的文件夹。与文件相关的所有数据将在req.files中,而非文件数据将在req.fields中。我已经在ejs模板引擎中使用它,并且在pug中同样适用。有关express-formidable的更多信息,请单击此链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接