首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Java Web文件下传原理分析(不借助开源fileupload下传jar包)

2012-11-23 
Java Web文件上传原理分析(不借助开源fileupload上传jar包)最近在面试IBM时,面试官突然问到:如果让你自己

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截图:

热点排行