`
wuhuajun
  • 浏览: 93656 次
  • 性别: 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的区别

    在Web开发中,当涉及到通过HTTP协议向服务器发送POST请求时,我们经常需要选择不同的数据编码类型,主要是`application/x-www-form-urlencoded`和`multipart/form-data`。这两种编码方式各有其适用场景,主要取决于...

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

    如果需要上传文件或处理复杂的数据结构,就需要使用multipart/form-data编码格式,而不是application/x-www-form-urlencoded。 application/x-www-form-urlencoded是HTML表单提交时使用的最常见的编码格式,它广泛...

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

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

    Spring Boot 一个接口同时支持 form 表单、form-data、json 的优雅写法.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    基于form-data请求格式详解

    值得一提的是,在HTML中,表单上传文件时必须设置其enctype属性为multipart/form-data,因为默认值是application/x-www-form-urlencoded,这不支持文件上传。 JavaScript中,XMLHttpRequest Level 2引入了FormData...

    http post请求体1

    本篇文章主要讨论的是HTTP POST请求体中的数据格式,特别是`multipart/form-data`和`application/x-www-form-urlencoded`两种常见类型。 1. `multipart/form-data` `multipart/form-data`是HTTP协议中用于上传包含...

    常见的四种POST 提交数据方式(小总结)

    `application/x-www-form-urlencoded`适合简单的键值对数据,`multipart/form-data`适用于文件上传,而`application/json`和`application/xml`则更适合复杂的数据结构和前后端之间结构化的数据交换。在实际开发中,...

    http/formdata

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

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

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

    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...

    python爬虫实现POST request payload形式的请求

    Request Payload则常用于JSON或其他自定义格式的数据提交,其Content-Type可能是`application/json`、`multipart/form-data`等。相较于Form Data,Request Payload更灵活,可以处理复杂结构的数据,比如对象或数组。...

    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_...

    易语言POST提交例子

    网络连接, “POST”, “/submit.php”, .post_data, “Content-Type: application/x-www-form-urlencoded”) ``` 4. **处理响应**:`发送HTTP请求`会返回服务器的响应,可以使用“读取网络流”命令读取响应内容。...

    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已知可以工作。 安装 ...

    详解Http请求中Content-Type讲解以及在Spring MVC中的应用

    5. `application/*`开头的类型,例如`application/xhtml+xml`(XHTML格式)、`application/xml`(XML数据格式)、`application/atom+xml`(Atom XML聚合格式)...-stream`(二进制流数据)以及`application/x...

Global site tag (gtag.js) - Google Analytics