日期:2014-05-18  浏览次数:20739 次

问一个servlet底层问题。
就是浏览器上传的时候,比如我上传一个100M的文件,然后提交表单.
1.这个100M的文件是怎么提交上去的?
是一次性把100M的文件和表单信息提交到服务器(tomcat),等到数据上传完后然后tomcat封装request,然后再从request里面getInputStream,再output吗?
如果真的是这样的话,那么我想先验证文件拓展名再决定(不考虑前端验证,必须服务器验证)是否保存在服务器,那岂不是要等100M的文件上传完毕之后,再根据表单信息来验证文件的拓展名?这样很耗时吧?

还是先不提交文件的字节流,仅仅把文件信息先提交,然后等待服务器端执行read方法然后浏览器再上传。

2.request.getInputStream这个方法给出来的字节流都有些什么数据?表单数据?客户端信息?页面信息?
如果是这样的话,那和getParam getHeard有什么区别?

------解决方案--------------------
我自己也去学习了一下到底java servlet是怎样处理;multipart request的,

得到的结果是如果是servlet3.0之前的,用request.getParameter()无法正确解析multipart 的
当然如果你确定用底层的getInputStream可以得到整个raw request但是需要你自己去解析,这应该不是目的,正因此之前的版本我看好多都用common fileupload

但在3.0之后(tomcat 7.0, glassfish3),他们好像添加了HttpServletRequest#getParts()来帮助解析此类request,这里有个例子

如果是3.0之前还有这样几个库可以帮助你解析
http://www.servlets.com/cos/index.html
http://users.boone.net/wbrameld/multipartformdata/