Java Web文件上传原理分析(不借助开源fileupload上传jar包)
最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不借助其他开源的文件上传jar包?
这一问,我楞了。现在开源MVC框架满天飞,大部分的框架像Struts2都会自动的把你上传的文件封装成Action的属性。几乎没有人自己去分析请求流数据,然后获取文件数据的。
总结下文件上传的几种实现:
一、像Struts2这样的框架自动将你上传的文件封装到Action的属性中,在配置文件里面你只需要指定文件上传的临时目录即可。
二、借助Apache的common-fileupload组件,实现文件上传。让开源组件帮你自动分析请求流数据,核心代码如下,详细的请参考http://morfil.iteye.com/blog/66945:
获取上传文件名:
贴个文字版的,里面的数据我使用谷歌浏览器截获的,方便大家拷贝
Request URL:http://127.0.0.1/dbm2-web/flowmgmt/FlowMgmtAction/uploadFile.go
Request Method:POST
Status Code:200 OK
Request Headers view source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:54738
Content-Type:multipart/form-data; boundary=---- WebKitFormBoundaryhQslmBE7nbTLTJzD
Cookie:JSESSIONID=1ge6jxgy4s166bzms8og4j7us
Host:127.0.0.1
Origin:http://127.0.0.1
Referer:http://127.0.0.1/dbm2-web/page/modules/flowmgmt/main.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1163.0 Safari/537.1
Request Payload
------WebKitFormBoundaryhQslmBE7nbTLTJzD
Content-Disposition: form-data; name="field1"; filename="exportFlow-4113.fd"
Content-Type: application/octet-stream
------WebKitFormBoundaryhQslmBE7nbTLTJzD--
Response Headers view source
Expires:Thu, 01-Jan-1970 00:00:00 GMT
Server:Jetty(7.3.1.v20110307)
Set-Cookie:JSESSIONID=oyklz60lg9aq1dn127p62ki0t;Path=/dbm2-web
Transfer-Encoding:chunked
从上述结构上我们可以知道,文件上传的Content-Type为multipart/form-data; boundary=----WebKitFormBoundaryhQslmBE7nbTLTJzD,而普通的form表单的Content-Type为application/x-www-form-urlencoded。因此,我们可以利用HttpServletRequest的request.getHeaderNames()方法和request.getHeaders(headName)方法得到请求头Headers中的Content-Type数据,然后根据Content-Type数据中是否包含multipart/form-data来区分请求是否为文件上传请求。其中boundary为文件数据的分隔符,用于区分上传多个文件。详细介绍请见http://yefeng.iteye.com/blog/315847
了解请求头的结构后,我们看看如何用程序去得到普通请求和文件上传请求的数据
http://blog.csdn.net/liuyar/article/details/6202331
二、文件上传Http请求Response截图:
三、文件上传Http请求Cookies截图:![]()