今天在学习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的值的问题。