浏览器如何处理带上传控件的表单及服务器如何获取参数值

POST /servlet/testServlet HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="image"; filename="jetty配置.png"
Content-Type: image/png


----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="comments"

截屏jetty配置

----WebKitFormBoundaryE19zNvXGzXaLvS5C


有文件上传时,表单提交方式必须是POST,且enctype必须是multipart/form-data

提交后,浏览器将表单的数据处理为一条消息,以控件为单元,用分隔符分开。

既可以上传键值对,也可以上传文件:

处理普通键值对控件的结果是一个请求头  Content-Disposition:form-data;name=属性名

                                            属性值


处理上传控件的结果是两个请求头        Content-Disposition:form-data;name=属性名;fileName=文件名称 

                                            Content-Type:上传文件的MIME类型

                                            文件流


1.get方式
get方式提交的话,表单项都保存在http header中,格式是
http://localhost:8080/hello.do?name1=value1&name2=value2这样的字符串。server端通过request.getParameter是可以取到值的。

2.post方式(enctype为缺省的application/x-www-form-urlencoded)
表单数据都保存在http的正文部分,格式类似于下面这样:用request.getParameter是可以取到数据的

name1=value1&name2=value2

3.post方式(enctype为multipart/form-data,多用于文件上传)
表单数据都保存在http的正文部分,各个表单项之间用boundary隔开。格式类似于下面这样:用request.getParameter是取不到数据的,这时需要通过request.getInputStream来取数据,不过取到的是个InputStream,所以无法直接获取指定的表单项(需要自己对取到的流进行解析,才能得到表单项以及上传的文件内容等信息)。这种需求属于比较共通的功能,所以有很多开源的组件可以直接利用。比如:apache的fileupload组件,smartupload等。通过这些开源的upload组件提供的API,就可以直接从request中取得指定的表单项了。

-----------------------------7d33a816d302b6
Content-Disposition:form-data;
name="userfile1";
filename="C:\my.txt"
Content-Type:application/octet-stream
abbXXXccc
-----------------------------7d33a816d302b6

Content-Disposition: form-data;

name="name1" value1

-----------------------------7d33a816d302b6

Content-Disposition: form-data;

name="name2" value2

-----------------------------7d33a816d302b6


你可能感兴趣的:(浏览器如何处理带上传控件的表单及服务器如何获取参数值)