安装 formidable,multiparty 模块

npm install formidable,multiparty –save -d

表单上传

<form id="addForm" enctype="multipart/form-data">
<fieldset>
<h3>创建用户</h3>
姓名:<input type="text" name="name" placeholder="请输入姓名"/>
<br> <br>
头像:<input type="file" name="icon" multiple="multiple">
<br> <br>
<input type="button" onclick="submit1()" value="提交(formidable处理)"/>
<input type="button" onclick="submit2()" value="提交(multiparty处理)"/>
<br> <br>
</fieldset>
</form>

ajax将表单内容发送至后台接口:

<script src="/js/jquery-1.9.1.min.js"></script>
<script>
function submit1(){ var data = new FormData($('#addForm')[0]); //获取表单内容 ajaxFormPost("/api/user/addUser_with_formidable",data,function(data){ //ajax提交表单
console.log("formidable处理结果:",data); alert(data.code+":"+data.msg); }); } function submit2(){
var data = new FormData($('#addForm')[0]); //获取表单内容 ajaxFormPost("/api/user/addUser_with_multiparty",data,function(data){ //ajax提交表单
console.log("multiparty处理结果:",data); alert(data.code+":"+data.msg); });
} //ajax Post方法封装
function ajaxFormPost(url,formData,callBack){
$.ajax({
type:'POST',
dataType:'text',
processData: false, // 告诉JSLite不要去处理发送的数据
contentType: false, // 告诉JSLite不要去设置Content-Type请求头
data:formData,
url:url,
success:function(data){
data = JSON.parse(data);
callBack(data);
},
error:function(data){
console.log('error:',data)
callBack(data);
}
});
} </script>

注意:express项目中app.js一定引入body-parser模块

var bodyParser = require('body-parser');

app.use(bodyParser.json());  // form表单解析必须
app.use(bodyParser.urlencoded({ extended: false }));

方式1:formidable解析表单关键代码


exports.formidableFormParse = function(req,callback){

    var form = new formidable.IncomingForm({
encoding:"utf-8",
uploadDir:"public/upload", //文件上传地址
keepExtensions:true //保留后缀
});
form.parse(req, function(err, fields, files) {
var obj ={};
Object.keys(fields).forEach(function(name) { //文本
console.log('name:' + name+";filed:"+fields[name]);
obj[name] = fields[name];
}); Object.keys(files).forEach(function(name) { //文件
console.log('name:' + name+";file:"+files[name].path);
obj[name] = files[name];
}); callback(err,obj);
});
}
 
返回值obj内容:

{
“name”: “wuwanyu”,
“icon”: {
“size”: 8666,
“path”: “public\upload\upload_713dad980d7b7dce0847476820f8b1d4.jpg”,
“name”: “4eff22a5d3d8341d3bf472adbb151c18.jpg”,
“type”: “image/jpeg”,
“mtime”: “2016-04-06T13:18:15.508Z”
}
}

方式2:multiparty解析表单关键代码

exports.multipartyFormParse = function(req,callback){
var form = new multiparty.Form({
encoding:"utf-8",
uploadDir:"public/upload", //文件上传地址
keepExtensions:true //保留后缀
}) form.parse(req, function(err, fields, files) {
var obj ={};
Object.keys(fields).forEach(function(name) { //文本
console.log('name:' + name+";filed:"+fields[name]);
obj[name] = fields[name];
}); Object.keys(files).forEach(function(name) { //文件
console.log('name:' + name+";file:"+files[name]);
obj[name] = files[name];
}); callback(err,obj);
});
}
返回值obj的内容(一个文件时):

{
“name”: [ “tom”],
“icon”: [
{
“fieldName”: “icon”,
“originalFilename”: “4eff22a5d3d8341d3bf472adbb151c18.jpg”,
“path”: “public\upload\SKt_XEwcxnBD_4qc6qI-PBw9.jpg”,
“headers”: {
“content-disposition”: “form-data; name=\”icon\”; filename=\”4eff22a5d3d8341d3bf472adbb151c18.jpg\”“,
“content-type”: “image/jpeg” },
“size”: 8666
}
]
}

返回值(多个文件时 ):

{
“name”: [ “tom” ],
“icon”: [
{
“fieldName”: “icon”,
“originalFilename”: “3bd870116ff9708f5141aa8a374aeabf.jpg”,
“path”: “public\upload-MVUwGgwT9DbGCZh50yBGLHy.jpg”,
“headers”: {
“content-disposition”: “form-data; name=\”icon\”; filename=\”3bd870116ff9708f5141aa8a374aeabf.jpg\”“,
“content-type”: “image/jpeg” },
“size”: 25754
},
{
“fieldName”: “icon”,
“originalFilename”: “4eff22a5d3d8341d3bf472adbb151c18.jpg”,
“path”: “public\upload\HJIOAYHXjluOTtWZ2M-qwHUq.jpg”,
“headers”: {
“content-disposition”: “form-data; name=\”icon\”; filename=\”4eff22a5d3d8341d3bf472adbb151c18.jpg\”“,
“content-type”: “image/jpeg” },
“size”: 8666
}
]
}

总结:

formidable和multiparty都能实现解析表单的功能,返回值的数据结构和字段名称稍有不同。

formidable解析结果是json数据格式的。multiparty 返回值是数组格式的,解析同一个字段多个值时,比如上传多张图片,使用multiparty更合适。

文件将被上传到public/upload目录下,如果要移动文件位置,可以使用fs模块的rename方法。

Github项目地址: https://github.com/wuwanyu/formidable_multiparty_demo

项目运行效果图

(1)formidable表单上传及处理结果:

(2)multipaty表单上传及处理结果:

在express项目中使用formidable & multiparty实现文件上传的更多相关文章

  1. 在 .NET Core项目中使用UEditor图片、文件上传服务

    在.NET Framework中使用UEditor时,只需要将UEditor提供的后端服务,部署为一个子程序,即可直接使用文件上传相关的服务,但是UEditor官方并未提供.Net Core的项目,并 ...

  2. .net core 3.0web_razor page项目_使用中间件接受大文件上传报错_httpRequest.Form threw an exception of type Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException_Request body too large

    前言:在web项目的.net framework时文件上传时,自己常用一般处理程序接受上传文件,上传文件的大小限制是可以项目的webconfig里配置.   到core项目使用一般处理程序变成了中间件 ...

  3. 在Express中使用Multiparty进行文件上传及POST、GET参数获取

    Express 版本:4.14.1 在Express中,文件上传需要用到multiparty中间件,在项目目录中,通过npm install multiparty –save进行安装必要组件. 前端H ...

  4. 在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能

    前言 之前的项目中一直使用的是FCKeditor,昨天突然有个想法:为什么不试一下新的CKEditor呢?于是花了大半天的时间去学习它的用法,现在把我的学习过程与大家分享一下. 谈起FCKeditor ...

  5. 【原创】MVC项目中使用JQuery的upladify图片上传插件相关问题的解决方案

    一. 关于Uploadify Uploadify是一个jQuery插件,你可以很容易的为你的网站添加多个文件上传功能.有两个不同的版本(HTML5和Flash)允许你灵活选择为您的网站和回退方法正确实 ...

  6. SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用

    依然是项目结构图和所需jar包图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsi ...

  7. 讲解开源项目:功能强大的 JS 文件上传库

    本文作者:HelloGitHub-kalifun HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  8. JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    上篇博客我们详细的聊了<JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术>,本篇博客依然是JavaEE开发中的内容,我们就来聊一下SpringMVC中的自定义消息转发器 ...

  9. 【SSH网上商城项目实战13】Struts2实现文件上传功能

    转自:https://blog.csdn.net/eson_15/article/details/51366384 上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细 ...

随机推荐

  1. mogoose的bug之不能根据类型为number的字段查找数据

    Users.find({paw:6868}).exec() //返回的结果为空 Users.find({paw:"6868"}).exec() //返回的结果也为空 Users.f ...

  2. linux命令(31):more

    一.more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 ...

  3. django之对FileField字段的upload_to的设定

    用django开发,经常要处理用户上传的文件, 比如user模型里面如果又个人头像的字段 ImageField等等,而django在FielField字段(包括ImageField)的支持和扩展是做的 ...

  4. 使用B或BL跳转时,下一条指令的地址的计算

    .text .global _start 3_start: b step1 step1: ldr pc, =step2 step2: b step2 反汇编代码: : eaffffff b 0x4 : ...

  5. Web应用程序开发的标准架构

  6. 【Java】Iterator迭代器总结

    迭代器是一个对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构,此外,迭代器通常被称为轻量级对象:创建它的代价小.因此,经常可以见到对迭代器有些奇怪的限制,例如Jav ...

  7. linux命令之数据盘格式化挂载

    1,查看数据盘 在没有分区和格式化数据盘之前,使用”df -h “命令是无法看到数据盘的,可以通过 fdisk -l 查看机器情况(找出所有硬盘个数及设备名称)  提示:若没有发现/dev/xvdb ...

  8. GIS+=地理信息+行业+大数据——基于云环境流处理平台下的实时交通创新型app

    应用程序已经是近代的一个最重要的IT创新.应用程序是连接用户和数据之间的桥梁,提供即时訪问信息是最方便且呈现的方式也是easy理解的和令人惬意的. 然而,app开发人员.尤其是后端平台能力,一直在努力 ...

  9. 【WPF】C#代码动态改变控件的样式

    需求:C#代码生成的一组按钮Button需要设置样式. 如果是在XAML中引入样式: <!-- 引入资源 --> <UserControl.Resources> <Res ...

  10. map和object互相转换

    /** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<String ...