今天在学习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值的问题的更多相关文章

  1. 表单提交数据格式form data

    前言: 最近遇到的最多的问题就是表单提交数据格式问题了. 常见的三种表单提交数据格式,分别举例说明:(项目是vue的框架) 1.application/x-www-form-urlencoded 提交 ...

  2. form表单中enctype="multipart/form-data"的作用

    在我们使用php导入和导出excel表格的时候经常会见到 enctype="multipart/form-data",哪他的作用是什么呢? ENCTYPE="multip ...

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

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

  4. 【Python全栈-后端开发】Django进阶2-Form表单

    Django进阶2-Form表单 Django的Form主要具有一下几大功能: 生成HTML标签(可以保留上次输入内容) 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页 ...

  5. 表单enctype不对导致action中无法接受数据

    表单enctype不对导致action中无法接受数据 描述:在用ssh开发项目的时候,可能会遇到一个问题, 那就是明明我的表单字段和JavaBean类中的字段都是一一对应的,而且action也实现了模 ...

  6. 表单enctype属性

    首先知道enctype这个属性管理的是表单的MIME编码.共有三个值可选:1.application/x-www-form-urlencoded2.multipart/form-data3.text/ ...

  7. 表单提交 multipart/form-data 和 x-www-form-urlencoded的区别

    表单提交表单有两种提交方式,POST和GET.通常我们会使用POST方式,一是因为形式上的安全 :二是可以上传文件. 我之前经常忽略掉表单的编码类型,觉得它特别长比较难记,而且不设置也似乎不影响什么. ...

  8. java web解决表单重复提交问题

    我们大家再进行web开发的时候,必不可少会遇见表单重复提交问题.今天就来给总结如何解决表单提交问题,欢迎大家交流指正. 首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提 ...

  9. php解决表单重复提交

    php解决表单重复提交时间:2015-2-28 | 评论:1条评论 | 被查看了 189 次 | 标签:php, W3cui重复提交是我们开发中会常碰到的一个问题,除了我们使用js来防止表单的重复提交 ...

随机推荐

  1. 基于pcntl的PHP进程池

    想必大家都知道可以通过多进程或者多线程的方式实现异步. PHP多进程编程当前主要有这几种方式, 1>基于pcntl实现多进程,这也是PHP自带的多进程玩法 2>Swoole自己修改PHP内 ...

  2. Eclipse怎么切换工作空间

    1.进行点击Eclipse编辑代码的窗口界面中,进行点击菜单中file的选项. 2.弹出了下拉菜单中进行选择为“switch workspace”的选项. 3.弹出了下一级菜单中进行选择为other的 ...

  3. SpringMVC关于拦截器的使用

    这个是基于之前的视图定位进行的. @ 目录 拦截器类:IndexInterceptor 配置拦截器 修改 index.jsp 效果 拦截器类:IndexInterceptor package inte ...

  4. linux驱动之内核空间几种长延时的实现策略的优劣评估

    本文转载自http://blog.chinaunix.net/uid-23769728-id-3084737.html 这里所谓的长延时,是指其实现时间延时的粒度可以在HZ这一水准上.<深入Li ...

  5. Docker 架构及工作原理

    通过下图可以得知,Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具 与 Docker 引擎 进行交互. ...

  6. 如何选择一台适合Java开发的电脑

    前言 最近在群里有同学求推荐Java开发用的电脑,所以胖哥就出个简单的专题,用我贫瘠的电脑知识来帮助大家选择适合开发的电脑配置.因为家里的主机已经带不动两个 IDEA 了,更别提开个 Docker 啥 ...

  7. Spring Boot 集成 Memcached

    Memcached 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站 ...

  8. 有了MDL锁视图,业务死锁从此一目了然

    摘要:MDL锁视图让一线运维人员清晰地查看数据库各session持有和等待的元数据锁信息,从而找出数据库MDL锁等待的根因,准确地进行下一步决策. 当多用户共同存取数据时,数据库中就会产生多个事务同时 ...

  9. JVM大作业5——指令集

    JVM的每一个线程都有一个虚拟机栈,方法调用时,JVM会在虚拟机栈内为该方法创建一个栈帧. 一条线程,只有正在执行的方法对应的栈帧时可活动的,这个栈帧被称为当前栈帧,当前栈帧对应的方法被称为当前方法, ...

  10. java基础知识点整理

    1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. &&:短路与,如果第一个表达式为false时,第二 ...