node进阶| 解决表单enctype="multipart/form-data" 时获取不到Input值的问题

Posted Jen Ho

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node进阶| 解决表单enctype="multipart/form-data" 时获取不到Input值的问题相关的知识,希望对你有一定的参考价值。

今天在学习node踩到一个坑:form设置enctype="multipart/form-data"上传文件时,无法获取到表单其他input的值。

因为之前上传文件用的是 formidable 

方法1:formidable (无法获取其他input的值)

引包 app.js

var app = express();
var express = require("express");
var router = require("./controller"); //前端MVC的C 一个顶层变量

 

controller/package.json

{
    "main" :"router.js"
}

POST请求 app.js:

app.post("/file_upload",router.uploadfile);

controller/router:

exports.uploadfile=function(req,res){
         // console.log(req.route);
    var form = new formidable.IncomingForm();
        form.encoding = \'utf-8\';  
        form.uploadDir = "./uploads"; //上传路径
          form.parse(req, function(err, fields, files) { // 表单上传到东西在fields 文件在files里面
              //更改文件名
          var timeStr = (Math.floor(Math.random()*9000+1000)).toString();
          var d = sd.format(new Date(),\'YYYYMMDDHHmmss\'+timeStr);
          var folder = fields.folder;
          var extname = path.extname(files.file.name); //文件类型
          var oldName = files.file.path;
          var newName = "./public/image/"+folder+"/"+d + extname;
          console.log(newName);
          console.log(folder);
          fs.rename(oldName,newName);
          //成功页
          res.send("<a href = \'/\'>返回</a>");

        });

}

views/up.ejs

<form style="width:40%;" method="post" action="/file_upload" enctype="multipart/form-data">
   <input type="file" id="exampleInputFile"  name="file">
  <input type="submit" class="btn btn-default">上传</input>
</form>

但是这种方法无法获取到form表单其他input的值

方法2:multer(可以获取)

引包 app.js

var express = require(\'express\');
var path = require(\'path\');
var index = require(\'./routes/index\');
var fs = require(\'fs\');
var multer = require(\'multer\');

app.js

app.use(\'/\', index);
var storage = multer.diskStorage({
     
       destination: function (req, file, cb) {
            cb(null, \'./uploads\')  //设定文件上传路径
       }, 
     //给上传文件重命名,获取添加后缀名
      filename: function (req, file, cb) {
          console.log(file.originalname) //上传文件的名字
          console.log(file.mimetype)    //上传文件的类型
          console.log(file.fieldname) // 上传文件的Input的name名
          console.log(file.encoding)    // 编码方式
         var fileFormat = (file.originalname).split("."); //采用分割字符串,来获取文件类型
        console.log(fileFormat)
        var extname = path.extname(file.originalname); //path下自带方法去获取文件类型
        console.log(extname);
          // cb(null, file.fieldname + \'-\' + Date.now() + "." + fileFormat[fileFormat.length - 1]); //更改名字
          cb(null, file.fieldname + \'-\' + Date.now() +  extname); //更改名字
      }
 });
var upload = multer ({storage:storage}) //定制化上传参数
app.post(\'/upload\', upload.array(\'logo\',2), function(req, res, next){
    console.log(req.body.txt)
    res.send({ret_code: \'0\'});
});

views/index.ejs

    <form action="/upload" method="post" enctype="multipart/form-data">
        <h2>单图上传</h2>
        <input type="file" name="logo">
        <input type="file" name="logo">
        <input type="text" name="txt">
        <input type="submit" value="提交">
    </form>

 

multer包成功解决了无法获取到表单其他input的值的问题。

 

以上是关于node进阶| 解决表单enctype="multipart/form-data" 时获取不到Input值的问题的主要内容,如果未能解决你的问题,请参考以下文章

enctype="multipart/form-data" 上传图片的时候发现加了这个后表单post的数据后台收不到,求解决方案

node.js后台进阶

C# form表单提交enctype="multipart/form-data" 与 enctype="application/x-www-form-urlencoded

form表单中enctype="multipart/form-data"的传值问题

表单的enctype="multipart/form-data"

jsp页面中添加 enctype="multipart-formdata'无法提交到后台得解决思路