关于前端上传文件全面基础扫盲贴(零)
关于前端上传文件全面基础扫盲贴(一) ----- XMLHttpRequest
关于前端上传文件全面基础扫盲贴(二) ----- File
关于前端上传文件全面基础扫盲贴(三) ----- FormData
关于前端上传文件全面基础扫盲贴(四) ----- FileReader
关于前端上传文件全面基础扫盲贴(五) ----- H5拖拽事件
关于前端上传文件全面基础扫盲贴(六) ----- 图片上传,旋转,重绘,预览等实战(附DEMO)javascript
摘自上面来源,分析的挺好,我就无耻得搬下来了FormData 对象的使用(直接看这个有点蒙圈,建议先看API再看这个实战代码好点,我就是踩过坑的人...╮(╯▽╰)╭)html
经过FormData对象能够组装一组用 XMLHttpRequest发送请求的键/值对。它能够更灵活方便的发送表单数据,由于能够独立于表单使用。若是你把表单的编码类型设置为multipart/form-data ,则经过FormData传输的数据格式和表单经过submit() 方法传输的数据格式相同,与普通的ajax相比,使用FormData的最大优势就是能够异步上传二进制文件前端
FormData对象FormData对象能够把全部表单元素的name与value组成一个queryString,提交到后台。 在使用ajax提交时,使用FormData对象能够减小拼接queryString的工做量
queryString是查询字符串,http查询字符串由url中?后面的值指定
当页面上的form以GET方式向页面发送请求数据时 (如数据含有不安全字符,则浏览器先将其转换成16进制的字符再传送,如空格被转换成%20时 ) ,web server 将请求数据放入一名为QUERY_STRING的环境变量中。 Request.queryString 方法是从这一环境变量中取出相应的值,并将被转成16进制的字符还原java
说了这么多,仍是要先看看兼容性如何,这么一看,还好啊(舒适提示:下图只表明支持程度,支持归支持,不必定百分百支持,因此用到部分方法时不兼容时正常的)web
先说说我上面说过的坑是怎么回事吧,我就按照实战代码写,而后觉得能直接看到我塞进去的东西,然而...ajax
var oMyForm = new FormData(); oMyForm.append("name", "Grady"); console.log(oMyForm) // 我觉得会输出Grady的,可是返回的是FormData对象
好吧,这里打印出[object FormData]
这玩意,chrome里长这样子的chrome
咦,怎么是个空的东西?我塞进去的数据呢?而后看到自己那堆方法,通过我大胆猜想跟虚心求教以后,FormData自己就这设置,想要看到属性只能去用方法拿到,因此...segmentfault
var oMyForm = new FormData(); oMyForm.append("name", "Grady"); console.log(oMyForm.get('name'))
这里就涉及到兼容性问题了,若是不兼容的话会输出TypeError: oMyForm.get is not a function
,若是正常的话就输出'Grady'.
下面的代码也是,我一开始使用猎豹浏览器编辑的,后来只好转为chrome正常写下去浏览器
下面咱们简单过一下比较经常使用的方法:安全
参数可选,一个HTML上的<form>表单元素——当指定了,这种方式建立的FormData对象会自动将form中的表单值也包含进去,包括文件内容也会被编码以后包含进去。
用于返回FormData对象中和指定的键关联的第一个值,若是你想要返回和指定键关联的所有值,那么可使用getAll()方法。
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form id="myForm" name="myForm"> <label for="name">name:</label> <input type="text" id="name" name="name"> <input type="submit" value="Submit!" id="submit"> </form> <p>你输出的值为:<span id='text'></span></p> <script type="text/javascript"> var myForm = document.getElementById('myForm'), text = document.getElementById('text'); myForm.addEventListener('submit', function (e) { e.preventDefault(); var oMyForm = new FormData(myForm) text.innerHTML = oMyForm.get('name'); }, false); </script> </body> </html>
参数 | 描述 |
---|---|
name | 字段名称 |
value | 字段的值,若是是传入两个参数的方式,那么该值是一个 USVString,若是不是,将被转成一个字符串。若是是传入三个参数的方式,那么该值将是一个布尔值(Blob),文件(File),或者一个 USVString,若是不是,将被转成一个字符串 |
filename | 可选:传给服务器的文件名称(一个USVString)。当第二个参数是一个布尔值(Blob)或者文件(File)的时候,Blob 对象的默认文件名是 "blob" |
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form id="myForm" name="myForm"> <label for="name">name:</label> <input type="text" id="name" name="name"> <input type="submit" value="Submit!" id="submit"> </form> <p>你输出的值为:<span id='text'></span></p> <script type="text/javascript"> var myForm = document.getElementById('myForm'), text = document.getElementById('text'); myForm.addEventListener('submit', function (e) { e.preventDefault(); var oMyForm = new FormData(myForm); oMyForm.set('name', 'abc'); text.innerHTML = oMyForm.get('name'); }, false); </script> </body> </html>
set() 和 append() 的区别在于,若是指定的键已经存在,set()会使用新值覆盖已有的值,而 append() 会把新值添加到已有值集合的后面。
参数 | 描述 |
---|---|
name | value中包含的数据对应的表单名称 |
value | 表单的值。能够是USVString 或 Blob (包括子类型,如 File) |
filename | 可选:传给服务器的文件名称 (一个 USVString), 当一个 Blob 或 File 被做为第二个参数的时候, Blob 对象的默认文件名是 "blob"。 File 对象的默认文件名是该文件的名称 |
方法会返回该 FormData 对象指定 key 的全部值。
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form id="myForm" name="myForm"> <label for="name">name:</label> <input type="text" id="name" name="name"> <input type="submit" value="Submit!" id="submit"> </form> <p>你输出的值为:<span id='text'></span></p> <script type="text/javascript"> var myForm = document.getElementById('myForm'), text = document.getElementById('text'); myForm.addEventListener('submit', function (e) { e.preventDefault(); var oMyForm = new FormData(myForm); oMyForm.append('name', 'abcd'); text.innerHTML = oMyForm.getAll('name'); }, false); </script> </body> </html>
返回一个 iterator对象 ,此对象能够遍历访问FormData中的键值对。其中键值对的key是一个 USVString 对象;value是一个 USVString , 或者 Blob对象。
返回一个迭代器(iterator),遍历了该 formData 包含的全部key ,这些 key 是 USVString 对象。
返回一个容许遍历该对象中全部值的 迭代器 。这些值是 USVString 或是Blob 对象。
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form id="myForm" name="myForm"> <label for="name">name:</label> <input type="text" id="name" name="name"> <input type="submit" value="Submit!" id="submit"> </form> <p>你输出的值为:<span id='text'></span></p> <script type="text/javascript"> var myForm = document.getElementById('myForm'), text = document.getElementById('text'), str = ''; myForm.addEventListener('submit', function (e) { e.preventDefault(); var oMyForm = new FormData(myForm); for (var pair of oMyForm.entries()) { str += 'entries: ' + pair[0] + ', ' + pair[1] + ';<br />'; } for (var key of oMyForm.keys()) { str += 'key: ' + key + ';<br />'; } for (var value of oMyForm.values()) { str += 'value: ' + value + ';<br />'; } text.innerHTML = str; }, false); </script> </body> </html>