愚墨的博客
  • 首页
  • 前端技术
  • 面试
只争朝夕不负韶华
  1. 首页
  2. 前端技术
  3. 正文

FormData

2016年07月17日 3825点热度 0人点赞 2条评论

今天的天气很不错,有风,有你,有太阳,但不热,随手写一下FormData。

FormDate是XMLHttpRequest level2 (有人说是FF4中新增加的对象,是谁无所谓啦)中新添加的一个接口,利用FormData对象,我们可以通过JavaScript用一下键值对来模拟表单控件,我们还可以使用使用ajax的send()方法来异步提交这个‘表单’,比起之前(我们都是将表单中的name  和value组成一个querystring提交到后台),FormData是在是好用多了,比起普通的ajax提交来说,FormData的最大优点就是我们可以异步的上传一个二进制文件。

使用方式也很简单(感觉有点怪)

第一种:先创建一个空的 FormData 对象,然后使用 append() 方法向该对象里添加字段

var formdata = new FormData();
formdata.append("name", "Manster");
formdata.append("age", 23);//这里的数字会被转为字符串
formdata.append("userfile", fileInputElement.files[0]);//fileInputElement中已经包含了用户所选择的文件
var oFileBody = '<a id="a"><b id="b">hey!</b></a>'; // Blob对象(二进制对象)包含的文件内容
var oBlob = new Blob([oFileBody], { type: "text/xml"});
oMyForm.append("webmasterfile", oBlob);

注: 字段"userfile"和"webmasterfile"的值都包含了一个文件.通过 FormData.append()方法赋给字段"age"的数字被自动转换为字符(字段的值可以是一个Blob对象,一个File对象,或者一个字符串,剩下其他类型的值都会被自动转换成字符串).

第二种:使用HTML表单来初始化一个FormData对象

<form action="" id="myForm">
    <input type="text" name="username">
    <input type="text" name="password">
</form>
</body>
<script>
    var formobj =  document.getElementById("myForm");
    var formdata = new FormData(formobj);
    formdata.append("school","上海交大");//用这种方式你可以添加一些用户不可见的键值
</script>

第三种:利用form元素对象的getFormData方法生成它!

var formobj =  document.getElementById("myForm");
var formdata = formobj.getFormData()

注意,formdata是一个不透明的对象,现在暂时只有一个append可以操作,不能通过序列化手段得到其里面的内容,这实在是遗憾。它的用法现在也只有一个,用于增强型的XMLHttpRequest对象的send方法中去!

结合ajax我们就可以将FormData对象发送到服务器。

var formobj =  document.getElementById("form");
var formdata = new FormData(formobj);
formdata.append("name", "Manster");
formdata.append("age", 23);
var xhr = new XMLHttpRequest();
xhr.open('post','/upload',true);
xhr.onload = function(){
    //dosomething....
}
xhr.send(formdata)

后台获取方式看你使用的是什么语言了,我简单的用node写一个例子

var http = require('http');
var url = require('url');
var fs = require('fs');
var formidable = require('formidable');
http.createServer(function(req,res){
    var urlObj = url.parse(req.url,true)
    var pathname = urlObj.pathname;
    if(pathname == '/upload'){
        //formidable这个包,不是核心模块,第三方模块
        var form = new formidable.IncomingForm();
        form.parse(req,function(err,fields,files){
            console.log(fields)//--->{name:"Manster",age:"23"}
            console.log('--------------')
            console.log(files)//------->文件
            fs.createReadStream(files.fileContent.path).pipe(fs.createWriteStream('./upload/'+files.fileContent.name));
        })
        form.on('end',function(){
            res.end('上传完成')
        })
    }
}).listen(4004,function(){
    console.log('success')
})

如有不对,欢迎来喷!

标签: 暂无
最后更新:2016年07月17日

愚墨

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇
下一篇 >

文章评论

  • 巴武占

    这个是个好东西 总结的很到位

    2016年07月17日
    回复
  • 匿名

    好文章,学习了 :grin: :grin:

    2016年07月18日
    回复
  • 取消回复

    搜搜看看
    历史遗迹
    • 2023年5月
    • 2022年9月
    • 2022年3月
    • 2022年2月
    • 2021年12月
    • 2021年8月
    • 2021年7月
    • 2021年5月
    • 2021年4月
    • 2021年2月
    • 2021年1月
    • 2020年12月
    • 2020年11月
    • 2020年9月
    • 2020年7月
    • 2020年5月
    • 2020年4月
    • 2020年3月
    • 2020年1月
    • 2019年5月
    • 2019年3月
    • 2019年2月
    • 2019年1月
    • 2018年9月
    • 2018年3月
    • 2018年2月
    • 2018年1月
    • 2017年11月
    • 2017年7月
    • 2017年6月
    • 2017年3月
    • 2017年2月
    • 2017年1月
    • 2016年12月
    • 2016年11月
    • 2016年9月
    • 2016年8月
    • 2016年7月
    • 2016年6月
    • 2016年5月
    • 2016年4月
    • 2016年3月
    • 2016年2月
    • 2016年1月
    • 2015年12月
    • 2015年10月
    • 2015年9月
    • 2015年7月
    • 2015年6月
    • 2015年4月

    COPYRIGHT © 2020 愚墨的博客. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS