json - 将表单类型更改为 multipart/form-data 会导致 req.body 为空

标签 json forms node.js express

当我在没有指定 enctype 的情况下设置表单时,Firefox 会自动将其设置为 application/x-www-form-urlencodedreq.body 包含输入到表单中的所有参数的漂亮的 JSON 表示。但是当我将 enctype 更改为 multipart/form-data 时,req.body 突然变空了。

这是我的表格:

<form action="/create" method="post" enctype="multipart/form-data">
  <fieldset>
    <div>
      <label>Category:</label>
    </div>
    <div>
      <select name="category">
      <option value="standard">Standard</option>
      <option value="custom">Custom</option>
    </div>
    <div>
      <input type="text" name="description">
    </div>
    <div>
      <label>User ID:</label>
    </div>
    <div>
      <input type="text" name="userid">
    </div>
    <div>
      <input type="submit" value="Go">
    </div>
  </fieldset>
</form>

console.log(JSON.stringify(req.body, null, 2));enctypemultipart/时打印出一个空对象form-data 并且当未指定 enctype 时,它打印出如下内容:

{
  category: "standard",
  userid: "foo"
}

发生这种情况的原因是什么?

最佳答案

尝试使用 busboy-body-parser 来检索请求正文参数和文件。

start.js
var bodyParser = require('body-parser');
var busboyBodyParser = require('busboy-body-parser');


// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
  extended: true
}));

// parse application/json
app.use(bodyParser.json());


//parse multipart/form-data    
app.use(busboyBodyParser());



controllers/someController.js
someAction: function(req,res){
     if(req.method == "POST"){
           res.end(JSON.stringify(req.body)+JSON.stringify(req.files));
     }
}
//{"text":"testx"}{"anexo":{"data":{"type":"Buffer","data":.... }}} 
//req.body = {"text":"testx"}
//req.files = {"anexo":{"data":{"type":"Buffer","data":.... }}} 


views/someController/someAction.html
<form method="post" id="multipart" enctype="multipart/form-data">
    <input type="text" id="text1" name="text" value="testx" />
    <input type="file" id="anexo" name="anexo"  />
    <input type="submit" value="Enviar" />
</form>

要创建一个文件上传,你需要工作如果流,例如:

/* file props
{  
   "data":{"type":"Buffer","data":.... },
   "fieldname":"anexo",
   "originalname":"images (1).jpg",
   "encoding":"7bit",
   "mimetype":"image/jpeg",
   "destination":"c:\\live\\sources\\uploads\\",
   "filename":"eventclock_images (1)_1443706175833.jpg",
   "path":"c:\\live\\sources\\uploads\\eventclock_images(1)_1443706175833.jpg",
   "size":9986
}
*/

var fileStream = fs.createWriteStream(file.path);
fileStream.write(file.data);
fileStream.end();

fileStream.on('error', function (err) {
    //console.log("error",err);
});
fileStream.on('finish', function (res) {
    //console.log("finish",res);
});     

关于json - 将表单类型更改为 multipart/form-data 会导致 req.body 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21002253/

相关文章:

javascript - 如何在 JavaScript 中从 json 中获取特定数据?

java - 哪些 Jackson maven 依赖项包含在 spring 3.1 项目中以进行 JAXB JSON 编码?

javascript - 如何将 JavaScript 对象转换为 LITERAL 字符串?

javascript - 使用 tumblr API (JSON) 和 $.getJSON 从我的 tumblr 博客中获取最新的帖子

jquery - 为什么disable_with不适用于rails form_for?

javascript - 表单信息显示在另一页上

node.js - 不能在控制指令或其他混入中定义函数

javascript - 如何检查当前时间是否在数组中存储的两个给定时间之间

jquery - drop 事件不会在主干 View 上触发

ruby-on-rails - 使用 Ruby on Rails 3 表单助手的多个 CSS 类/id 名称