`
wuhuajun
  • 浏览: 92003 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

application/x-www-form-urlencoded和multipart/form-data

    博客分类:
  • java
 
阅读更多

关于application/x-www-form-urlencoded等字符编码的解释说明

 在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。 下边是说明: application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
 补充
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。

 

 

 

通过HTTP模拟GET或POST请求,提交数据到服务端获取响应,比较常见些;但如上传文件到服务端,使用html form当然简单了,而因环境所限有时需要使用模拟方法去提交有附件(文件上传)的表单。我们暂且不说如何去模拟数据,通过一个简单的form看看当请求发生时,客户端提交了什么样的数据给服务端。

 

下面是一个简单的html form,两个文本输入框,一个文件上传(这里我选择一张图片),注意有文件上传的form的enctype属性。

html form
1 <form action="sql.aspx" method="post" enctype="multipart/form-data">
2 <input id="Text1" name="content" type="text"/><br />
3 <input id="Text2" name="uploadImg" type="text"/><br />
4 <input id="File1" type="file" name="image0"/><br />
5 <input id="Submit1" type="submit" value="submit"/>
6  </form>

 

为了查看表单提交时,向服务端post了什么数据,这里我使用Fiddler来查看。Fiddler确实是个不错的工具,注意当url主机地址是localhost时Fiddler捕获不到,需要再localhost后加一点(.)即可,打开Fiddler,浏览带上面form的page,输入数据提交,此时在Fiddler中可看到post的数据了。下面是一部份数据的截图。

表单提交的数据

 

分析其中的数据不难得出,一个表单中的数据域(input type="text")对应的格式为

-----------------------------7da119c1004a6
Content-Disposition: form-data; name="content"

this is a txt value

一个文件(input type="file")对应的格式为(通常为表单最后一个参数)

-----------------------------7da119c1004a6
Content-Disposition: form-data; name="image0"; filename="E:\CAI\875.jpg"
Content-Type: image/pjpeg
[文件内容]

结尾处是-----------------------------7da119c1004a6--

 

有了上面的数据做参考,按照其格式组织数据,post到服务端,同样可以达到html form提交的效果。要特别注意其格式:如回车换行,差一个都可能得不到正确的响应,还有请求的Content-Length一定计算对。下面是一个参考:

代码
publicstring POSTfile(string v1,string v2, string file)
{
string boundary ="---------------------------"+ DateTime.Now.Ticks.ToString("x");

//请求
WebRequest req = WebRequest.Create(@"http://localhost.:4944/WebSite1/getfile.aspx");
req.Method
="POST";
req.ContentType
="multipart/form-data; boundary="+ boundary;

//组织表单数据
StringBuilder sb =new StringBuilder();
sb.Append(
"--"+ boundary);
sb.Append(
"\r\n");
sb.Append(
"Content-Disposition: form-data; name=\"content\"");
sb.Append(
"\r\n\r\n");
sb.Append(v1);
sb.Append(
"\r\n");

sb.Append(
"--"+ boundary);
sb.Append(
"\r\n");
sb.Append(
"Content-Disposition: form-data; name=\"uploadImg\"");
sb.Append(
"\r\n\r\n");
sb.Append(
"v2");
sb.Append(
"\r\n");

sb.Append(
"--"+ boundary);
sb.Append(
"\r\n");
sb.Append(
"Content-Disposition: form-data; name=\"image0\"; filename=\"e:\\a.jpg\"");
sb.Append(
"\r\n");
sb.Append(
"Content-Type: image/pjpeg");
sb.Append(
"\r\n\r\n");

string head = sb.ToString();
byte[] form_data = Encoding.UTF8.GetBytes(head);
//结尾
byte[] foot_data = Encoding.UTF8.GetBytes("\r\n--"+ boundary +"--\r\n");

//文件
FileStream fileStream =new FileStream(file, FileMode.Open, FileAccess.Read);
//post总长度
long length = form_data.Length + fileStream.Length + foot_data.Length;
req.ContentLength
= length;

Stream requestStream
= req.GetRequestStream();
//发送表单参数
requestStream.Write(form_data, 0, form_data.Length);
//文件内容
byte[] buffer =new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
int bytesRead =0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) !=0)
requestStream.Write(buffer,
0, bytesRead);
//结尾
requestStream.Write(foot_data, 0, foot_data.Length);
requestStream.Close();

//响应
WebResponse pos = req.GetResponse();
StreamReader sr
=new StreamReader(pos.GetResponseStream(), Encoding.UTF8);
string html = sr.ReadToEnd().Trim();
sr.Close();
if (pos !=null)
{
pos.Close();
pos
=null;
}
if (req !=null)
{
req
=null;
}
return html;
}
 
 
 
分享到:
评论

相关推荐

    浅析application/x-www-form-urlencoded和multipart/form-data的区别

    我们知道在通过POST方式向服务器发送AJAX请求时最好要通过设置请求头来指定为application/x-www-form-urlencoded编码类型。知道通过表单上传文件时必须指定编码类型为"multipart/form-data"。那么为什么要这么设置呢

    使用axios发送post请求,将JSON数据改为form类型的示例

    通常前端通过POST请求向服务器端提交数据格式有4中,分别是”application/x-www-form-urlencoded”格式、” multipart/form-data”格式、”application/json”格式和”text/xml”格式。通常最常见的是”application/...

    PB12.5 POST方式提交JSON或FORM-DATA到HTTP API

    Power Builder 12.5,使用ole MSXML2.ServerXMLHTTP方式,对接WEB API,以选用JSON和x-www-form-urlencoded方式提交数据,POST/GET方式均可。

    http/formdata

    multipart/form-data主要是为了解决application/x-www-form-urlencoded编码格式在传输大量二进制数据或包含非ASCII字符文本时的低效问题。multipart/form-data的数据由多个part组成,part间通过boundary分隔符进行...

    Web应用安全:HTTP方法.pptx

    或 multipart/form-data。为二进制数据使用 多重编码 是否幂等 幂等 非幂等 HTTP方法 2、GET和POST比较 GET POST 长度限制 http协议没有限制,但是实际浏览器或服务 器有(最大2048) 理论上没有,可能会收到服务器...

    jqueryform.js

    contentType: "application/x-www-form-urlencoded; charset=GBK", // headers:{"ClientCallMode" : "ajax"},//添加请求头部 enctype="multipart/form-data" success: function(data){ if(data.msg=="success...

    webbench-plus-post:这是一个基于webbench-1.5的项目。 添加了POST方法,支持applicationx-www-form-data-urlencoded和rfc1867,并且用户可以指定多个HTTP标头

    内容类型:application / x-www-form-urlencoded webbench-发布内容--header header1:value1 --header header2:value2 -t time -c数字 2.Content-Type:multipart / form-data; boundary = random_bytes_or_...

    文件上传指南pdf

    在 Java Web 应用程序中,文件上传是常规的操作,文件上传指的是通过浏览器把用户 本地的文件上传到 Web ..."application/x-www-form-urlencoded"。Html 标签的&lt;input type="file"/&gt;可以允许客户端用户 选择文件。

    为Retrofit统一添加post请求的默认参数的方法

    APP_FORM_URLENCODED(application/x-www-form-urlencoded), APP_JSON(application/json), APP_OCTET_STREAM(application/octet-stream), MULTIPART_FORM_DATA(multipart/form-data), TEXT_HTML(text/html), ...

    vccustombr

    post数据,是直接在http协议头将Content-Type设为application/x-www-form-urlencoded,这样服务器会将提交的数据,当作表单数据处理。发送的数据格式也为:userid=lilu&data=post图片类&name=天漏客。而post图片则是...

    MFC UploadPhoto实例加源码.rar

    post数据,是直接在http协议头将Content-Type设为application/x-www-form-urlencoded,这样服务器会将提交的数据,当作表单数据处理。发送的数据格式也为:userid=lilu&data=post图片类&name=天漏客。而post图片则是...

    drupal-client:用于Drupal Services的Javascript客户端

    在服务器设置中,仅启用响应格式化程序json来解析mime类型application/json , application/x-www-form-urlencoded和multipart/form-data的请求。 一个Javascript项目-node.js或Titanium已知可以工作。 安装 ...

    Django REST Swagger实现指定api参数

    form 参数,描述 Content-Type of application/x-www-form-urlencoded 和 multipart/form-data 的请求报文body的参数 swagger指定api参数就可以在文档相应的api条目中显示出api的描述、正常输出、异常输出、参数的...

    http-z:从模型解析到HTTP消息

    application/x-www-form-urlencoded application/json , text/plain 从模型构建HTTP请求/响应原始消息: 方法,协议,协议版本/状态码,原因 查询参数 标头 饼干 正文,支持以下contentTypes: multipart/...

    项目中axios发送 post 请求 数据类型为Form Data 数据时踩的坑(设置了请求头信息之后还未成功 但是发送过去的类型不对)解决方法

    项目中post后端要求发送的数据放在formdata中, 那么第一件事情设置请求头信息,,现在用的很... 'Content-Type':'application/x-www-form-urlencoded' } }).then(res=&gt;{ if(res.status){ this.$message.success(修

    node-append-field:符合 W3C HTML JSON 表单的字段追加器

    对于实现application/x-www-form-urlencoded和multipart/form-data解析器的人很有用。 它最适用于使用Object.create(null)创建的对象。 否则它可能与原型中的变量(例如hasOwnProperty )发生冲突。 安装 npm ...

    REST轻松:用于Firefox的简单REST客户端

    支持application/x-www-form-urlencoded和multipart/form-data参数编辑器 能够为POST和PUT请求指定任意数据 HTML预览,既可以文本形式显示,也可以在浏览器中呈现 HTML,JavaScript / JSON和XML的语法突出显示 即将...

    e-civ-api:使用Node.js和koa2的用于e-civ的Restful API

    约定使用JSON格式传输数据,POST、PUT、DELET方法支持的Content-Type为application/x-www-form-urlencoded、multipart/form-data、application/json可配置支持跨域。非上传文件推荐application/x-...

    Struts2文件的上传和下载

    1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。 2) multipart/form-data:这种编码方式的表单会以二进制流...

Global site tag (gtag.js) - Google Analytics