基于Java语言的文件上传组件研究

时间:2022-09-05 04:24:16

基于Java语言的文件上传组件研究

摘要:随着Internet的普及,资源共享已经成为网民传递信息的常用方式。因此实现文件上传功能对广大网民来说越来越重要。该文在RFC文件的基础上,利用SmartUpload和commons fileupload两种方式来讲解如何实现文件上传。

关键词:SmartUpload;commons fileupload;上传;RFC

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)33-7475-05

随着Internet的普及,越来越多的网民将自己计算机中的文件上传至服务器端供其他网民或亲朋好友浏览、欣赏。最典型的文件上传是在生活中,很多网民都建立了自己个性化的博客或者私人空间,可以将在日常工作、生活、旅游中的照片上传到空间,供大家浏览。

文件上传,涉及到对文件的读写操作,需要大量的代码实现,并且容易引发异常。幸运的是,目前有很多比较常用的文件上传工具,可以大大简化我们编写上传代码的代码量,目前比较常用的组件有SmartUpload和commons fileupload两种方式。该文选择了目前比较流行的JSP语言作为讲解的案例,首先介绍RFC做界面,接着通过SmartUpload和commons fileupload两种方式讲解文件上传操作,并通过两种方式的对比给出最佳上传操作。

1 上传界面

1.1 RFC1867协议介绍

在最初的 http 协议中,并没有文件上传方面的功能。 rfc1867协议为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 表单控件就可以发送文件。绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。

RFC1867协议主要是在HTTP协议的基础上为Input标签增加了file属性,同时限定了Form的method必须为Post,表单中Enctype必须为multipart/form-data,表示上传的是二进制数据,如果不设置,默认是application/x-www-form-urlencoded,这种设置是不能实现上传功能。除了以上几个属性外,当然还增加了一些与此相关属性,但都不是本文讨论的重点,我们在此只讨论与上传相关的一些属性。

1.2 按照RFC1867协议创建界面

我们以一个商品添加为例,按照RFC1867协议创建界面如图1所示。

2 文件上传功能实现

实现上传文件的组件有很多,常用SmartUpload和:Commons-FileUpload。在这里我们分别对两种上传方式进行使用,最后通过测试得出一种最优的上传方式。

2.1 SmartUpload组件上传

2.1.1 SmartUpload简介【1】

SmartUpload是一个可免费使用的全功能的文件上传、下载组件,适用于嵌入执行上传、下载操作的jsp文件中。该组件有以下几个特点:

1)使用简单,编写少量代码,完成上传下载功能。

2)能够控制上传内容,通过SmartUpload组建可以获得全部上传文件的信息,包括文件名称、类型、大小等,方便操作。

3)能够控制上传文件的大小、类型进行控制,SmartUpload为了控制上传过程中的数据,提供了相应的方法用于限制不符合要求的数据文件。

缺点:目前已经停止更新,服务网站也已关闭。

2.1.2 SmartUpload组件常用类及其方法

SmartUpload组件主要包含File,Files,SmartUpload核心类,常用方法如表1、表2、表3所示。

2.1.3 SmartUpload上传代码实现

将jspsmartupload.jar 添加到WEB-INF\lib目录下,在WebRoot下创建upload文件夹。关键代码如下:

SmartUpload smartUpload = new SmartUpload();//初始化SmartUpload对象

smartUpload.initialize(pageContext);

com.jspsmart.upload.File file = null;

String alloweString = "jpg,gif";//允许上传类型

String denieString = "jsp,asp,php,aspx,html,htm,exe,bat";//不许上传类型

com.jspsmart.upload.Request req = null;

int file_Max_size = 2*1024*1024; //设置上传文件大小

int i = 0;

try {

smartUpload.setAllowedFilesList(alloweString);//设置允许上传文件类型

smartUpload.setDeniedFilesList(denieString);// 设置不允许上传类型

smartUpload.setMaxFileSize(file_Max_size); //单个文件最大限制

smartUpload.setCharset("GBK");

smartUpload.upload();//执行上传

file = su.getFiles().getFile(0); //得到上传第一个文件的信息

String filepath = "upload\\";//设置文件在服务器的保存位置

filepath += file.getFileName();

file.setCharset("gbk");

file.saveAs(filepath, SmartUpload.SAVE_VIRTUAL); //文件另存为

req = su.getRequest();

//获取添加新闻页面传递过来的参数

String goodsName = req.getParameter("goodsName");

String goodsPrice = req.getParameter("goodspPrice");

String goodsDesc = req.getParameter("goodsDesc");

} catch (Exception e) {

e.printStackTrace();

}

其中file.saveAs(filepath, SmartUpload.SAVE_VIRTUAL)方法是将文件存储在指定的的路径中,两个参数中第一个参数是另存的文件名,第二个参数是另存的选项,该选项有三个值,分别是SAVE_VIRTUAL表明是以web应用程序的根目录作为另存文件的保存目录,SAVE_PHYSICAL表明是以操作系统的根目录作为另存文件的保存目录,SAVE_AUTO则表示让组件自己决定。根据笔者的开发经验,最好使用SAVE_VIRTUAL,以方便后面的程序移植。

2.2 Commons-FileUpload上传

2.2.1 Commons-FileUpload简介[2]

Commons-FileUpload是Apache Commons下面的一个用于处理HTTP文件上传的子项目。主要有以下几个特点.

1)使用简单,Commons-FileUpload组件可以方便地嵌入到JSP文件中,在JSP文件中仅编写少量代码即可完成文件的上传功能,十分方便。

2)能够全程控制上传内容:可以获得全部上传文件的信息,包括文件名称、类型、大小等,方便操作。

3)能够对上传文件的大小、类型进行控制:为了避免在上传过程中出现异常数据,在Commons-FileUpload组件中,专门提供了相应的方法用于对上传文件进行控制。

2.2.2 Commons-FileUpload组件常用类及其方法

Commons-FileUpload常用类与接口分别为ServletFileUpload、FileItem接口、FileItemFactory接口,其常用方法如表4、表5、表6所示。

2.2.3 Commons-FileUpload实现上传功能

在实现上传之前,首先在项目中引入commons-fileupload-1.2.2.jar和commons-io-2.4.jar文件,可以直接放在WEB-INF下的lib文件夹中。其次我们在实现上传功能分五步操作:

1)检查请求类型

2)声明对象

3)转换请求对象

4)保存上传文件

5)获取普通字段

核心代码如下:

request.setCharacterEncoding("utf-8");

String uploadFileName = ""; //上传的文件名

String fieldName = ""; //表单字段元素的name属性值

//请求信息中的内容是否是multipart类型

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

//上传文件的存储路径(服务器文件系统上的绝对文件路径)

String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/" );

if (isMultipart) {

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

try {

//获取form表单中所有数据

List items = upload.parseRequest(request);

Iterator iter = items.iterator();

while (iter.hasNext()) { //依次处理每个文件

FileItem item = (FileItem) iter.next();

if (item.isFormField()){ //判断是否是普通表单字段

fieldName = item.getFieldName(); //表单字段的name属性值

if (fieldName.equals("goodsName ")){

//输出表单商品名称字段的值

out.print("商品名称:"+item.getString("UTF-8")+"

");

}else if (fieldName.equals("goodsPrice ")){

//输出表单商品价格字段的值

out.print("商品价格:"+item.getString("UTF-8")+"

");

} else if (fieldName.equals("goodsDesc ")){

//输出表单商品描述字段的值

out.print("商品描述:"+item.getString("UTF-8")+"

");

}

}else{ //文件表单字段

String fileName = item.getName();

if (fileName != null && !fileName.equals("")) {

File fullFile = new File(item.getName());

File saveFile = new File(uploadFilePath, fullFile.getName());

item.write(saveFile);

uploadFileName = fullFile.getName();

out.print("上传成功后的文件名是:"+uploadFileName);

}}}

} catch (Exception e) {

e.printStackTrace();

}}

2.3 运行测试

我们让程序分别运行,分别使用1M和20M的文件进行上传测试,在使用1M图片上传时,两种技术都能顺利的完成,但是在使用20M的文件上传时,SmartUpload出现了cup或者内存占用过高问题,只有重启服务器,才能恢复正常,而Commons-FileUpload很顺利的完成上传任务,限于篇幅这里不再显示运行结果图,请读者自己测试。

3 结束语

通过java语言的两种常用上传组件的使用、对比测试后,得出使用Commons-FileUpload开发上传程序,会使系统更稳定和高效的工作。

参考文献:

[1] 陈焕英,张红琴.SmartUpLoad组件在JSP项目开发中的设计与实现[J].漯河职业技术学院学报,2012(2):18-19.

[2] 使用JSP/Servlet技术开发新闻系统[M].北京:电子工业出版社,2011.

上一篇:基于C#的Word 文档自动导出模块的设计与实现 下一篇:车身尺寸控制系统设计与实现的简述