我是靠谱客的博主 文静大门,最近开发中收集的这篇文章主要介绍浅析http请求头常见的表单文件上传首先先了解下application/x-www-form-urlencoded和multipart/form-data的区别application/x-www-form-urlencoded:multipart/form-data:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先先了解下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以便处理.



最后

以上就是文静大门为你收集整理的浅析http请求头常见的表单文件上传首先先了解下application/x-www-form-urlencoded和multipart/form-data的区别application/x-www-form-urlencoded:multipart/form-data:的全部内容,希望文章能够帮你解决浅析http请求头常见的表单文件上传首先先了解下application/x-www-form-urlencoded和multipart/form-data的区别application/x-www-form-urlencoded:multipart/form-data:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部