多部分/表单数据与数组

6

我有一个简单的表单:

<form method="post" action="/test">
  <input type="hidden" name="arr[]" value="val1">
  <input type="hidden" name="arr[]" value="val2">
  <input type="hidden" name="arr[]" value="val3">
  <input type="submit" value="Submit">
</form>

使用控制器:

//...
server.post('/test', function(req, res) {
    res.json(req.body);
});
//...

这个可以用以下方法返回:

{
  arr: [
    "val1",
    "val2",
    "val3"
  ]
}

然而,当我将enctype更改为multipart/formdata时。
<form method="post" action="/test" enctype="multipart/form-data">
  <input type="hidden" name="arr[]" value="val1">
  <input type="hidden" name="arr[]" value="val2">
  <input type="hidden" name="arr[]" value="val3">
  <input type="submit" value="Submit">
</form>

服务器现在的响应是:
{
  arr[]: "val3"
}

什么问题?需要进行某种配置吗?
如果你想知道,我也发送了一个文件,所以我需要 "multipart/form-data"。

1
看起来多方伙伴似乎没有正确处理这种情况。很想看看会出现什么情况。如果您找不到解决方案,请尝试在以下位置报告:https://github.com/andrewrk/node-multiparty/issues - Oleg Sklyar
你找出问题出在哪了吗?我这里也有同样的问题。 - Oriesok Vlassky
数组语法是一种非标准扩展的形式语法。你的 URL 编码数据的 body 解析器可以识别它,但是你的多部分数据的 body 解析器却不能。由于你没有提供 [mcve],所以我们不知道你正在使用哪些 body 解析器,因此我们无法确定是因为没有支持还是支持需要启用。 - Quentin
1个回答

0

这可能与 body-parser 的使用有关(特别是 urlencoded 方法)。默认情况下,它仅适用于 media-type 为 application/x-www-form-urlencoded 的请求。

你的主应用程序模块可能有以下几行代码:

const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded());

我想,你可以添加以下内容来使类型为 multipart/form-data 的请求也被解析:

app.use(bodyParser.urlencoded({
  type: 'multipart/form-data'
}));

多部分语法与url编码语法完全不同。您不能将一个解析器用于另一个。 - Quentin
糟糕,我的错!但是body-parser没有多部分语法,您需要一个专用模块来处理多部分请求,例如在body-parser文档中提到的busboy或multer。 - Tobi Kremer
他们已经在使用一个(否则他们不会得到他们所说的结果),但我们不知道是哪一个。 - Quentin
只是猜测:该问题标记为“kraken.js”,因此可能是formidable。我认为,第一个示例中看到的结果可以归因于使用body-parser的 { extended: true } 标志。 - Tobi Kremer

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