基于Struts2的随书光盘管理系统文件上传模块设计

2013-04-29 20:40夏宇红夏文忠
电脑知识与技术 2013年9期

夏宇红 夏文忠

摘要:为有效解决随书光盘文件的上传,以Struts2框架的Common-FileUpload组件为基础,讨论了使用Struts2框架上传文件的开发配置,在满足随书光盘系统功能的情况下,优化系统功能,保证系统性能稳定,方便管理员和读者的使用。

关键词: 大文件上传;随书光盘;Struts2

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)09-2149-02

基于网络的随书光盘系统中,文件的传送是系统核心。网络应用中的FTP曾经是文件传送的主要方式,但FTP难于和B/S结构的网络系统无缝集成,且FTP还存在安全性问题,故B/S结构的文件传送组件正逐渐成为文件传送的主流。Struts2[1]是一个优秀的开源框架,它集成了Apache开源项目的Common-Fileupload组件,在上传组件原有文件的基础上,进行了进一步封装,更进一步的简化了文件上传。通过Struts2的文件上传,只需要通过三个属性封装表单里的文件域,即可非常轻松地完成文件上传。Struts2提供对文件下载支持的stream的结果类型,通过借助于Struts2提供的文件下载支持,应用可以实现非西欧字符文件名的文件下载,并可以在文件下载前检查用户的权限,从而通过授权控制来控制文件下载。鉴于随书光盘系统只针对读者提供服务,如果允许所有用户无限制的下载,那将极大的降低系统性能,通过对用户身份进行识别甄别,即可保证用户的使用,又可保证系统的性能。

1 基于B/S结构的上传组件

RFC1867协议[2]在HTTP协议的基础上定义了网页文件上传的基本方式,即为表单的INPUT标签增加了file属性,同时限定了form的method必须为POST,ENCTYPE必须为multipart/form-data,当POST方法的ENCTYPE设定为multipart/form-data时,提交表单数值以二进制流的方式来处理表单数据并把文件域指定文件也封装到请求当中,不再以字符串方式提交请求数据。

Java技术中有两个常用的文件上传项目:Common-FileUpload和Cos。不管使用哪个框架,它都负责解析出HttpServletRequest请求中的所有域。上传框架获得文件域对应的文件内容,通过IO流将文件内容写入服务器的任意位置,从而完成文件上传。Common-Fileupload框架是Apache组织下jakarta-commons[3]项目组下的一个子项目,该框架方便地将multipart/form-data类型请求中的各种表单域解析出来。该项目依赖另一个项目:Common-IO。Common-IO是处理文件的读写操作功能库。Common-FileUpload框架通过调用Common-IO组件来完成对客户端与服务端文件的读写。

Struts2默认使用Jakarta的Common-Fileupload文件上传框架,但需要在WEB应用于中增加commons-io-2.0.1.jar和commons-fileupload-1.2.2.jar,将Struts2项目lib下这两个文件复制到WEB应用WEB-INF\lib路径下即完成组件部署。Struts2文件上传支持在原有文件上传项目上做进一步封装,简化了文件上传的代码实现,取消了不同上传项目上的编程差异。Struts2的Action无需处理HttpServletRequest请求,因Struts2的Action已经与Servlet API彻底分离,Struts2框架负责解析HttpServletRequest请求中的参数,包括文件域,Struts2使用File类型来封装文件域。

2 基于Struts2的内置控件的大文件上传方法

2.1上传页面设计

随书光盘管理系统主要是对随书光盘进行管理与利用,管理员利用UltraISO或WinISO等软件把随书光盘处理为ISO镜像文件并压缩,然后通过随书光盘管理系统的数据管理页面,对随书光盘进行编辑随书关联信息并上传。在本系统中,文件上传功能是系统核心。系统在进行文件上传的同时把书目数据信息保存到后台数据库中,并把与读者借阅读者的信息也保存到相应的数据表中,实现图书的借阅与随书光盘的同步推送。执行过程如图1所示:

客户端浏览器可以通过WEB方式访问随书光盘系统,如果是管理员登录,可以编辑随书光盘信息,上传随书光盘文件;如果是读者通过浏览器访问系统,读者通过所借阅图书查询随书光盘信息并下载随书光盘文件。

在随书光盘系统中,上传文件的文件名采用上传时间加上5位随机数的方式,这样可以在同一目录唯一生成一个文件名,例如:2013032587659.rar。上传成功后系统把文件存储在WEB服务器的Upload目录,然后把新生成的文件名和管理员编辑的信息写入Mysql数据库中以方便读者浏览下载。

2.2上传文件处理

常见的随书光盘通常都是文件体积较大的文件,例如CD-ROM[4]的最大存储容量为700M;目前许多随书光盘采用DVD格式,而常见的单面DVD[5]存储容量为4.7G。这些文件经过打包压缩处理后,容量也能达到1GB甚至更大,这样的大文件上传对B/S结构的WEB服务器具有很大的压力,为了能让WEB容器提供稳定可靠的服务,在设计上传组件时,需要针对大文件上传作专门的优化。

Struts2提供了一个文件上传的拦截器,通过配置该拦截器可轻松实现文件过滤。Struts2中文件上传过滤器是fileUpload,为了让拦截器起作用,需要在该Action中配置拦截器引用。fileUpload拦截器可以指定两个参数。

allowedTypes:该参数指定允许上传的文件类型,多个文件类型之间以英文逗号分隔。

maximunSize:该参数指定允许上传的文件大小,单位是字节。

通过配置struts.xml文件,实现文件的上传类型与大小的限制,下面是部分关键配置代码:

2.3上传异常处理

随书光盘系统的文件上传是系统中重要的功能,在文件上传过程中,会产生不可预见的问题,如上传失败,连接超时等。如何处理好这些系统异常,将影响系统的稳定及正常使用。Struts2默认使用input逻辑视图,即upload.jsp页面处理上传异常,通过Struts2标签库把异常信息显示在upload.jsp页面上,这种显示对中文支持不好,界面不友好。

Struts2提供了WEB应用的国际化支持,需要配置相应的key提示信息,如文件超大,提示“struts.messages.error.file.too.large”;选择了不允许的上传文件类型,错误提示信息对应的国际化资源文件中的key为“struts.messages.error.content.type.not.allowed”。在自己的国际化资源文件中增加该key消息,以以改变文件类型不允许的提示信息。

提示文件超大和文件类型不允许的国际化资源文件的代码为:

#改变上传文件太大提示信息

#改变文件类型不允许的提示信息

3 结束语

B/S结构的随书光盘系统实现了非书电子资料的网络应用,提升了图书馆服务读者的品质。系统开发中,文件上传是重要的一环,本系统使用Struts2框架的Common-FileUpload组件实现了文件上传的功能,在完成既定功能的同时,保证了系统的稳定,提升了服务读者的范围,具有一定的现实意义。

参考文献:

[1] 李刚.Struts 2.1权威指南——基于WebWork核心的MVC开发[M].北京:电子工业出版社,2009.

[2] Network Working Group.RFC1867协议[EB/OL]. http://www.ietf.org/rfc/rfc1867.txt.

[3] jakarta-commons项目 [EB/OL].http://commons.apache.org/.

[4] 肖飞,王运琼.基于光盘映像文件的CD-ROM数据加密与解密方法[J].计算机科学,2009,36(5):299-301.

[5] 高铁钢,郭丽文.DVD光盘教学模式研究[J].中国电化教育,2007(5):46-49.