form 提交数据编码梳理
之前对form单提交的操作一直都是迷迷糊糊,知道怎么用,但是随着ajax2的出现,我们有更多的方式操作form表单提交,但是底层的原理我们要好好的做个梳理。
常见的form提交有post和get这两种形式,他们对各自的编码都有不同的理解,post适合大量数据的提交,语义上改变了数据状态,get是一种获取获取数据的一种形式,两者在编码上是有不同的实现。
关于编码的 form 标签的属性
- accept-charset:可以指定form编码形式
- enctype: 规定在发送表单数据之前如何对其进行编码。有三种设置类型
- 默认为application/x-www-form-urlencoded:发送前编码所有字符
- multipart/form-data:不对字符编码,包含文件上传控件的表单时,必须使用该值
- text/plain:空格转换为 "+" 加号,但不对特殊字符编码。
- method:规定用于发送 form-data 的 HTTP 方法。有 post 和 get
method
浏览器使用 method 属性设置的方法将表单中的数据传送给服务器进行处理。共有两种方法:POST 方法和 GET 方法。
如果采用 POST 方法,浏览器将会按照下面两步来发送数据。首先,浏览器将与 action 属性中指定的表单处理服务器建立联系,一旦建立连接之后,浏览器就会按分段传输的方法将数据发送给服务器。
在服务器端,一旦 POST 样式的应用程序开始执行时,就应该从一个标志位置读取参数,而一旦读到参数,在应用程序能够使用这些表单值以前,必须对这些参数进行解码。用户特定的服务器会明确指定应用程序应该如何接受这些参数。
另一种情况是采用 GET 方法,这时浏览器会与表单处理服务器建立连接,然后直接在一个传输步骤中发送所有的表单数据:浏览器会将数据直接附在表单的 action URL 之后。这两者之间用问号进行分隔。
accept-charset
默认的,无论表单提交的method是post 还是 get,都会默认使用页面的编码进行数据的编码,但是一旦指定了这个参数,那么他就会运用你约定的编码方式来编码你的数据。
post提交
这里我们使用编码为GBK的页面做提交
<form action="/example/html5/demo_form.asp" method="post">
name: <input type="text" name="fname" /><br />
<input type="submit" value="提交" />
</form>
提交后为http的内容为
fname=%BA%C3
如果指定 accept-charset 为 UTF-8
<form action="/example/html5/demo_form.asp" method="post" accept-charset="UTF-8">
name: <input type="text" name="fname" /><br />
<input type="submit" value="提交" />
</form>
提交的内容为
fname=%E5%A5%BD
get 提交方式
同样适用GBK页面编码提交数据
<form action="/example/html5/demo_form.asp" method="get">
name: <input type="text" name="fname" /><br />
<input type="submit" value="提交" />
</form>
由于是get形式提交,参数会在请求的url上展示
example/html5/demo_form.asp?fname=%E5%A5%BD
如果指定 accept-charset 为 UTF-8
<form action="/example/html5/demo_form.asp" method="get" accept-charset="UTF-8">
name: <input type="text" name="fname" /><br />
<input type="submit" value="提交" />
</form>
在提交的url后面的参数编码变为了
example/html5/demo_form.asp?fname=%E5%A5%BD
当然你可以在普通的文本提交里的form表单属性里加上 enctype=application/x-www-form-urlencoded
,表示要对所有的表单字段做编码。
enctype="multipart/form-data"
在用表单做文件提交时,我们必须使用这个属性标示浏览器要对编码,而且你的提交方式必须post。否则你的那文件
比如我们使用get方法来上传文件
<form
action="/example/html5/demo_form.asp"
method="get"
accept-charset="UTF-8"
enctype="multipart/form-data">
name: <input type="text" name="fname" />
<input type="file" name="pic" />
<input type="submit" value="提交" />
</form>
提交后数据由url querystring 传入:
/example/html5/demo_form.asp?fname=asdf&pic=FullSizeRender.jpg
可以看到数据没了
当我们使用 POST 方法提交数据后
<form
action="/example/html5/demo_form.asp"
method="post"
accept-charset="UTF-8"
enctype="multipart/form-data">
name: <input type="text" name="fname" />
<input type="file" name="pic" />
<input type="submit" value="提交" />
</form>
可以看到请求体的内容为
------WebKitFormBoundarypbYSrhCXKEdYIDbR
Content-Disposition: form-data; name="fname"
好
------WebKitFormBoundarypbYSrhCXKEdYIDbR
Content-Disposition: form-data; name="pic"; filename="FullSizeRender.jpg"
Content-Type: image/jpeg
------WebKitFormBoundarypbYSrhCXKEdYIDbR--
HTML5 FormData
进入HTML5 时代我们可以使用 ajax2 + FormData 来上传二进制流。注意请不要设置 xhr 的 contentType, 因为你使用了 form-data 形式上传数据,应该又浏览器来决定:FormBoundary的内容。
var formData = new FormData();
formData.append("username", "好");
formData.append("accountnum", 123456); // 数字 123456 会被立即转换成字符串 "123456"
var request = new XMLHttpRequest();
request.open("POST", "http://foo.com/submitform.php");
request.send(formData);
在请求里可以看到
------WebKitFormBoundary0SD0cBR9xNMTPnAf
Content-Disposition: form-data; name="username"
好
------WebKitFormBoundary0SD0cBR9xNMTPnAf
Content-Disposition: form-data; name="accountnum"
123456
------WebKitFormBoundary0SD0cBR9xNMTPnAf--
form 提交数据编码梳理的更多相关文章
- form表单提交数据编码方式和tomcat接受数据解码方式的思考
http://blog.sina.com.cn/s/blog_95c8f1ac010198j2.html *********************************************** ...
- $.ajax使用总结(一):Form提交与Payload提交
http://blog.csdn.net/yiifaa/article/details/73468001 *********************************************** ...
- ajax Form提交与Payload提交
后端处理前端提交的数据时,既可以使用Form解析,也可以使用JSON解析Payload字符串. Form解析可以直接从Request对象中获取请求参数,这样对象转换与处理相对容易,但在大片JSON数据 ...
- 关于button和form提交的一些问题
1.form 中type 为submit 和button的区别 submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理( ...
- 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- AngularJS系列:表单全解(表单验证,radio必选,三级联动,check绑定,form提交验证)
一.查看$scope -->寻找Form控制变量的位置 Form控制变量 格式:form的name属性.input的name属性.$... formName.inputField.$pristi ...
- struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
我的前台页是这样的: <body> <form action="test.action" method="post"> ...
- jquery.form.js实现将form提交转为ajax方式提交的使用方法
本文实例讲述了jquery.form.js实现将form提交转为ajax方式提交的方法.分享给大家供大家参考.具体分析如下: 这个框架集合form提交.验证.上传的功能. 这个框架必须和jquery完 ...
- jquery.validate+jquery.form提交的三种方式
原文:http://www.cnblogs.com/datoubaba/archive/2012/06/06/2538873.html jquery.validate+jquery.form提交的三种 ...
随机推荐
- VueJS组件之间通过props交互及验证
props 是父组件用来传递数据的一个自定义属性.父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop". 父组件通过props ...
- [译]RabbitMQ教程C#版 - “Hello World”
[译]RabbitMQ教程C#版 - “Hello World” 先决条件本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需 ...
- Spring Cloud Zuul API服务网关之请求路由
目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 通过前几篇文章的介绍,我们了解了Spring Cloud ...
- GIT客户端的使用【原创】
这次分享的方式,采用的是视频的形式,视频是本人录制. 在做项目使用SVN的时候经常有各种错误出现,所以萌发使用git的想法.在学习git的过程中发现一个神器就是分支,虽然在SVN里也有分支,但由于机制 ...
- 如何使用CocoaPods安装使用及配置私有库以及管理依赖库 【原创】
CocoaPods是什么 在iOS开发中势必会用到一些第三方依赖库,比如大家都熟悉的ASIHttpRequest.AFNetworking.JSONKit等.使用这些第三方类库能极大的方便项目的开发, ...
- 关于 Swift 的一点初步看法
本文转自:http://onevcat.com/2014/06/my-opinion-about-swift/ 感谢原作者 尽管四点半就起床去排队等入场,结果还是仅仅能坐在了蛮后面的位置看着大屏幕參加 ...
- memcached 搭建
linux 下memcached 的搭建 memcached 下载地址:http://www.danga.com/memcached/dist/ libevent 下载地址:http://libev ...
- CentOS6.5升级内核从2.6.32到3.2.14
由于最近想要在服务器上跑IOU,但是在部署VMware后发现不能正常启动,总是提示内核无法载入,什么C header files matching your running kernel were n ...
- cakephp 基本的环境
这里是在 window下的环境搭建,我假设php,apache,mysql,的基本环境都ok,如果没有的话,偷个懒,用集成环境吧,我用的wampserver.1:去官网(http://cakephp. ...
- combination_m_n
def combination_2_n(l): n, r = len(l), [] for i in range(0, n, 1): s = i + 1 for ii in range(s, n, 1 ...