用JAVA实现大文件上传及显示进度信息
---解析HTTP MultiPart协议
(本文提供全部源码下载,请访问 https://github.com/1269085759/up6-jsp-mysql)
一. 大文件上传基础描述:
各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容。
比如:
Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息。
而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息。
优点:使用框架内置对象可以很方便的处理来自浏览器的MultiPart二进制信息请求,协议分析操作不用开发人员参与。
缺点:其接收数据包过程完全被封闭在框架内置对象中,直到本次请求信息处理(接收)完毕后,才允许开发人员从接口调取表单及文件内容。上传过程中的进度信息无法访问,无法上传大尺寸文件(比如几百兆以上的大文件二进制信息)。
目标:我们要在JAVA WEB框架中,依靠Filter过滤器的能力,实现不依靠框架内置对象,从浏览器请求字节流中解析MultiPart协议,取得本次用户请求的所有信息,包括多二进制文件信息及其他表单项信息。用户上传的文件尺寸将不受限制。而且在传输过程中,我们可以实时获得当前传输进度信息。
注:.NET框架中可依靠IHttpModule接口对象达到JAVA框架中Filter的能力,本文不做描述。
本文最终完成图:
1.1 普通Post请求协议及MultiPart协议
普通POST请求协议,见图:
Content-Length为请求信息内容的字节长度
最下方红圈内为本次表单请求信息
MultiPart请求协议,见图:
<