浅析http请求头常见的表单文件上传

首先先了解下application/x-www-form-urlencoded和multipart/form-data的区别

application/x-www-form-urlencoded:

是常用的表单发包方式,普通的表单提交,或者js发包,默认都是通过这种方式,

<form enctype="application/x-www-form-urlencoded" action="http://" method="POST">
    <input type="text" name="name" value="homeway">
    <input type="text" name="key" value="nokey">
    <input type="submit" value="submit">
</form

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。

当action为post时候,浏览器把form数据封装到http body中,然后发送到server。


multipart/form-data:

上传张图片看看

Content-Type: multipart/form-data; boundary=---------------------------27646987427698
Content-Length: 198449

-----------------------------27646987427698
Content-Disposition: form-data; name="x1"

52
-----------------------------27646987427698
Content-Disposition: form-data; name="y1"

个人理解区别在于:如果没有 type=file 的控件,form表单会自动form的enctype属性为编码方式默认的 application/x-www-form-urlencoded

,常用有两种: application/x-www-form-urlencoded 和 multipart/form-data ,

但是如果有 type=file 的话,就要用到 multipart/form-data 了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file)、Content-Type(默认为text/plain)、name(控件name)等信息,并加上分割符(boundary)。


通过表单提交数据的方法有两种,一种是GET 方法,另一种是 POST
方法,前者通常用于提交少量的数据,而在上传文件或大量数据时,应用POST 方法。 HTML 代码中,在<form> 标签中添加以下代码可以页面显示一个选择文件的控件。
<input type="file" name="file01">
在页面中显示如下(可能随浏览器不同而不同)可以直接在文本框中输入文件名,也可以点击按钮后弹出供用户选择文件的对话框。
浏览器编码
在向服务器端提交请求时,浏览器需要将大量的数据一同提交给Server 端,而提交前,浏览器需要按照Server 端可以识别的方式进行编码,对于普通的表单数据,这种编码方式很简单,编码后的结果通常是

field1=value2&field2=value2&的形式,如这种编码的具体规则可以在rfc2231 里查到,通常使用的表单也是采用这种方式编码的,

Servlet 的
API 提供了对这种编码方式解码的支持,只需要调用ServletRequest
类中的方法就可以得到用户表单中的字段和数据。

 
这种编码方式(

 application/x-www-form-urlencoded

)虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类

数据,浏览器采用了另一种编码方式,即

 "multipart/form-data"



的编码方式,采用这种方式,浏览器可以很容易的表单内的数据和

文件一起。这种编码方式先定义好一个不可能在数据中出现的字符串作为分界符,然后用它将各个数据段分开,而对于每个数据段都

对应着HTML 页面表单中的一个Input 区,包括一个content-disposition

属性,说明了这个数据段的一些信息,如果这个数据段

的内容是一个文件,还会有Content-Type 属性,然后就是数据本身。

 

Java代码   收藏代码
  1. -----------------------------7d52e1f4065c  
  2.   
  3. Content-Disposition: form-data; name="test"  
  4.   
  5.   
  6.   
  7. 简化  
  8.   
  9. -----------------------------7d52e1f4065c  
  10.   
  11. Content-Disposition: form-data; name="file1"  
  12.   
  13.   
  14. 三季稻看法上  
  15.   
  16. -----------------------------7d52e1f4065c  
  17.   
  18. Content-Disposition: form-data; name="image"; filename=""  
  19.   
  20. Content-Type: application/octet-stream  
  21.   
  22.   
  23.   
  24. -----------------------------7d52e1f4065c  
  25.   
  26. Content-Disposition: form-data; name="sub"  
  27.   
  28.    
  29.   
  30. upload  
  31.   
  32. -----------------------------7d52e1f4065c—  


 
  当你看到这个格式文件后,应该就理解了原来文件上传的原理就这么简单.

格式规定:每一行都是以回车换行(0xd0xa1310)界定,每一个数据实体都以类似于-----------------------------7d52e1f4065c界定,最后的用户数据终止是以实体界定符号后加了两个连字符(--).

该格式一目了然, 实体界定符之间是表单域实体,该实体的name指定的串就是表单ui组件的name.其值是回车换行+ui组件的值.

二进制数据实体多出了filename和Content-Type以便处理.



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值