[转] Form 表单数据处理 简单教程 formidable 使用心得

入门,高手见笑

表单数据一种是get方式, 另一种是post 方式

1.get方式

对于get方式,node处理起来非常简单

如以下代码:

var urlParsed = url.parse(request.url);
var getData = querystring.parse(urlParsed.query);
//getData 为object类型 同名表单为array

get返回结果:

{
    name: "blue5tar",
    hobby:["read", "surfing"]
}

2. post方式

post方式处理起来比较麻烦,但是有了node-formidable 这个module 我们就省事多了

使用npm安装 node-formidable

npm install formidable

formidable 使用方法

formidable = require("formidable"); //载入 formidable

var form = new formidable.IncomingForm();
var post = {},
     file = {};
form.uploadDir = ‘/tmp‘;  //文件上传 临时文件存放路径 

form
    .on(‘error‘, function(err) {
        console.log(err); //各种错误
    })
     //POST 普通数据 不包含文件 field 表单name value 表单value
    .on(‘field‘, function(field, value) {
        if (form.type == ‘multipart‘) {  //有文件上传时 enctype="multipart/form-data"
            if (field in post) { //同名表单 checkbox 返回array 同get处理
                if (util.isArray(post[field]) === false) {
                    post[field] = [post[field]];
                }
                post[field].push(value);
                return;
            }
        }
        post[field] = value;
    })
    .on(‘file‘, function(field, file) { //上传文件
        file[field] = file;
    })
    .on(‘end‘, function() {
        fn(); //解析完毕 做其他work
    });
form.parse(request); //解析request对象

post方式有个bug

当form 有enctype=“multipart/form-data” 和没有 enctype=“multipart/form-data” 时 同名表单处理的方式不一样。
有 enctype=“multipart/form-data” 时 同名表单会被最后一个value覆盖,
没有 enctype="multipart/form-data"时,同get一样 会返回一个array

所以, 在 ‘field’事件时,对form.type进行不同处理 , 同名表单都返回array

还有一个问题,上传文件时 如果不选择文件 也会在临时目录生成空的临时文件, 解决办法:
修改 formidable 模块 lib/incoming_form.js handlePart方法 在183行处添加:

if (part.filename == "") {
   return;
}

上传文件返回的结构如下:

{
 size: 40635, //文件大小
 path: ‘/tmp/f0423db2bf874499423ce409e2f222f4‘, //临时文件路径
 name: ‘arrow.png‘, //文件名称
 type: ‘image/png‘,  //文件 mime
 lastModifiedDate: Sun, 11 Mar 2012 07:19:44 GMT,
 _writeStream:
     { path: ‘/tmp/f0423db2bf874499423ce409e2f222f4‘,
     fd: 7,
     writable: false,
     flags: ‘w‘,
     encoding: ‘binary‘,
     mode: 438,
     bytesWritten: 40635,
     busy: false,
     _queue: [],
     drainable: true },
 length: [Getter],  //同size
 filename: [Getter], //同name
 mime: [Getter] //同type
}

文件上传到临时文件目录下,我们还要将临时文件, 移到我们的上传目录中

fs.rename(file.path, global.appConfig.uploadDir + ‘/‘ + file.filename);

有不对的地方,欢迎拍砖。

Links:

  1. 关于POST文件上传原理 看这里: http://club.cnodejs.org/topic/4f16442ccae1f4aa270010ad
  2. 关于node-formidable详解 看这里: http://club.cnodejs.org/topic/4f16442ccae1f4aa2700104d

原文地址:https://www.cnblogs.com/chris-oil/p/9425222.html

时间: 2024-08-11 18:58:25

[转] Form 表单数据处理 简单教程 formidable 使用心得的相关文章

form表单的简单验证onsubmit

form表单的代码 <form name="myform" action="" method="post"> <input type="text" name="search" id="scontent" placeholder="请输入" value=""/> <select id="stype"

MVC Form表单 管理简单的表

view添加表单 <div id="divForm"> @using (Html.BeginForm("AddOrUpdateTest", "ControllerName", FormMethod.Post,  new { id = "formId", @class = "" })) {              @Html.AntiForgeryToken() <table>   

【HTML】3.Form表单

标签 表单元素 标签 描述 文本框 <INPUT TYPE='text' -> 输入一行文本 密码 <INPUT TYPE='password' -> 输入一行文本,但不可见,只以星号显示 单元按钮 <INPUT TYPE='radio' -> 只能选择一个选项 复选框 <INPUT TYPE='checkbox' -> 可以选择一个或多个选项 隐藏域 <INPUT TYPE='hidden' -> 该域的值对用户不可见,但会提交给服务器 下拉列

AJAX PHP无刷新form表单提交的简单实现(推荐)

下面小编就为大家带来一篇AJAX PHP无刷新form表单提交的简单实现(推荐).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 ajax.php <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head>

ajax form表单提交 input file中的文件

ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了解决这个问题我走了不少弯路: 1.用原生的 input file , 不支持ajax上传文件,你肯定会说可以用 ajax form表单上传了呀?不过我后面还要调用上传成功后用js处理一些对话框,所以这种方法排除 2.用了 uploadify 上传插件,弄出来能上传东西,结果不理想:因为不能判断上传的

Form表单Ajax系列化提交数据

页面上有一个商品的颜色尺码二维输入框,输入完毕之后需要把数据进行提交,点击立即购买则进行页面的跳转,通过form表单将数据提交到后台,而点击添加到购物车的话,则会通过ajax进行数据的提交,页面不进行跳转.前台样式: 下面是form表单: <form id="cartForm" action="${ctx}/cart/save" method="post"> <div class="product-page-optio

按Enter键后Form表单自动提交的问题

怪事年年有,今年特别多. 话说,最近项目中遇到一件怪事,当我鼠标focus在文本框中,轻轻敲了下回车键,尼玛页面突然刷新了,当时把宝宝给吓得. 接下来就是一番苦逼的烧脑和蛋疼~ 一.被表象所迷惑 突然出现这种情况,脑海中第一反应是,keydown事件是不是出问题了,然后找啊找啊找啊,然后没有然后. 在把input元素上的所有事件移除掉后,我自信的按了一下enter键.艾玛,又刷新了.心里那个苦哎. 二.列出所有可能 一阵捣鼓之后,脑海中列出了所有按下enter键后的改变,url改变,多了一个问号

html表单标记简单使用

1.<form>...</form> 表单标记 基本语法格式: <form action="url" method="get|post" name="name" onSubmit="" target=""> </form> 属性说明: action属性:改属性用来指定处理表单数据程序的URL地址. method属性:改属性用来指定数据传送到服务器的方式.有两种

简约的form表单校验插件

前言 网上有好多form表单校验插件,包括jquery的表单检验插件,这些中好多插件功能很齐全强大,提示方式很酷,很美观好看.本想拿来用,但是发现几个问题: 1.使用不方便.校验规则繁多,调用校验函数难记忆. 2.提示方式固定.一般插件给出固定的几种提示方式,但是实际中,不同系统都有自己的页面风格样式,有自己的提示方式,插件自带的一般用不上. 因此,我最终没有采用这些插件,以免用后出现难以修改或实现的情况. 如果一种校验插件能避免以上两个问题最好了,方便使用,提示方式自定义 ,所以自己做了一个简