首页 > 网站 > WEB开发 > 正文

从form的enctype属性到Content-Type再到request.getInputStream()

2024-04-27 15:13:45
字体:
来源:转载
供稿:网友

还是一个异常引发的故事:

需要实现一个手机客户端行为分析的需求,手机客户端需要上传一些数据文件。手机客户端通过http协议post方式上传数据文件的时候,我们发现在服务器端无法通过request.getInputStream()获取到相应的数据,调用request.getInputStream()读取数据里头啥都木有。

经过各种尝试我们注意到如下的情况:

1.在不做任何修改的情况下,调用request.getParameter()可以获取到部分数据,即url拼接参数的数据。

2.在不做任何修改的情况下,如果在之前任何地方都不调用request.getParameter(),而是直接调用request.getInputStream()是可以获取到数据的。

3.原来客户端使用默认的请求头Content-Type:application/x-www-form-urlencoded,修改此值为multipart/form-data或者application/octet-stream之后,通过request.getInputStream()可以获取到数据,即使之前调用过request.getParameter()。

最后的解决方法当然是客户端修改Content-Type,因为服务器端request.getInputStream()的方法不方便修改。今天具体分析下里头的原理。

一.从form的enctype属性到Content-Type

写html的时候我们都知道form有个属性enctype,默认值是application/x-www-form-urlencoded,这个值表示会将表单数据用&符号做一个简单的拼接。例如:

[plain] view plain copyPRint?POST /post_test.php HTTP/1.1   Accept-Language: zh-CN  User-Agent: Mozilla/4.0   Content-Type: application/x-www-form-urlencoded   Host: 192.168.12.102  Content-Length: 42  Connection: Keep-Alive  Cache-Control: no-cache     title=test&content=%B3%AC%BC%B6%C5%AE%C9%FA&submit=post+article  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表