叶倩文
摘要:文件的上传和下载在网络应用中非常普遍,应用各种文件上传与下载组件来实现可以简化操作、节约项目开发时间。介绍了jspSmartUpload、commons-fileUpload上传组件,Struts文件上传,Spring文件上传技术,及组件下载、输出流方式下载技术。
关键词:上传;下载;组件;类;对象
中图分类号:TP393文献标识码:A文章编号:1009-3044(2012)12-2776-03
Upload and Download Technology in Java Web Development
YE Qian-wen
(Sanshui Technical Secondary School and Vestibule School, Foshan 528100, China)
Abstract: Upload and download files are very common in network applications. The application of a variety of file upload and download components can simplify operations, save project development time. Introduced jspSmartUpload, commons-fileUploadcomponents, Struts and the Spring file upload technology, component download, The output stream download technology.
Key words: upload; download; component; class; object
文件的上传和下载在网络应用中非常普遍,可以通过流来实现文件的上传与下载,但是这种方式较为麻烦。为了节省开发项目的时间、简化操作,可应用各种文件上传与下载组件来实现。这些组件对许多操作进行了封装,提供了各种接口和方法,在开发时只需调用这些方法,即可实现文件的上传与下载。
在众多文件上传组件中,比较流行的是jspSmartUpload与commons-fileUpload,这两种组件为文件的上传与下载提供了便利的方法。下面介绍Java Web开发中常用的上传与下载组件及技术
1 jspSmartUpload组件
jspSmartUpload是一个功能较全面的上传与下载组件,可从www.jspsmart.com网站上下载。该组件有以下特点:
1)使用简单。jspSmartUpload组件对许多方法进行了封装,在web应用中只需要书写三五行代码就能完成文件上传下载操作。
2)有过滤功能。jspSmartUpload上传组件提供了获取全部上传文件的功能,例如获取文件名、文件大小、文件类型、扩展名等,并能对文件上传的大小、类型等做出限制,过滤掉不符合要求的文件。
3)下载方法灵活。使用jspSmartUpload组件可对Web服务器中任意目录下的文件进行下载。
2 commons-fileUpload组件
commons-fileUpload上传组件是Apache的一个开源项目,需要commons-io包的支持,在Apache的官方网站上均可下载。该组件使用方便,可以实现一个或多个文件的上传,同时能限制文件大小。与jspSmartUpload组件相比,commons-fileUpload对中文支持良好。基于上述优势,加之jspSmartUpload上传组件已经停止了开发,因此建议使用commons-fileUpload上传组件。通过com mons-fileUpload实现文件上传的基本步骤如下:
2.1创建DiskFileItemFactory对象
首先要创建DiskFileItemFactory对象,用于配置上传组件ServletFileUpload。代码如下:DiskFileItemFactory factory=new DiskFileItemFactory ( );
DiskFileItemFactory类提供了众多方法对上传文件进行设置,常用方法有:
1)public void setSizeThreshold(int sizeThreshold)
参数用于设置最大内存大小。Apache文件上传组件在解析上传数据中的每个字段内容时,需要临时保存解析出的数据,以便在后面进行数据的进一步处理(保存在磁盘特定位置或插入数据库)。因为Java虚拟机默认可以使用的内存空间是有限的,超出限制时将会抛出“java.lang.OutOfMemoryError”错误。如果上传的文件很大,例如800M的文件,在内存中将无法临时保存该文件内容,Apache文件上传组件转而采用临时文件来保存这些数据;但如果上传的文件很小,例如600个字节的文件,显然将其直接保存在内存中性能会更加好些。
2)public void setRepositoryPath (String repositoryPath)
参数用于设置临时目录,setRepositoryPath方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的获得临时文件夹的File getRepository()方法。
3)public File getRepository( )获取保存临时文件地址。
2.2创建ServletFileUpload对象
ServletFileUpload对象即上传文件的句柄。以DiskFileItemFactory对象为参数构造ServletFileUpload对象,代码为:
ServletFileUpload upload=new ServletFileUpload(factory);
ServletFileUpload类常用方法有:
1)boolean isMultipartContent(HttpServletRequest request)判断上传表单是否为上传表单类型。
2)List parseRequest(HttpServletRequest request)对requests对象进行解析,并把表单中的每一个输入项包装成一个FileItem对象,并返回一个保存了所有FileItem的list集合。
3 Struts文件上传
应用Struts实现文件上传很简单,无需向项目中添加单独的文件上传JAR包,只需要通过Struts标签库中的<html:file>标签生成<input type=file>元素,利用其提供的功能即可实现从HTML表单上上传文件。3.1<html:file>标签
<html:file>标签与<input type=file>元素实现的功能相同,都是用于实现文件上传操作。语法格式:
在使用
3.2 ActionForm Bean编写
在于JSP页面对应的ActionForm中,需要定义与
public class MyActionForm extends ActionForm{
private FormFile file;
public FormFile getFile( ){
return file;
}
public void setFile(FormFile file){ this.file=file;
}}
3.3实现文件上传
Struts实现文件上传是在Action类中实现的。可以分别创建读取上传文件的InputStream对象,将文件数据写到目标文件中的OutputStream对象,这样就能通过流将源文件数据写入到指定的目标文件中。例程序略。
4 Spring文件上传
Spring是简洁、高效的J2EE开发框架,其文件上传功能是通过Struts提供的Commons-fileUpload组件来实现。使用Spring实现文件上传功能,首先需要在DispatcherServlet上下文中添加分段文件解析器。这样,每个请求就会被检查是否包含上传文件,如果有,则应用上下文中已经定义的MultipartResolver就会被调用。
4.1配置文件上传解析器
在使用Spring实现文件上传时,首先需要配置文件上下文解析器。Spring的DispatcherServletResolver类用于解析上传的文件数据,该类位于org.springframework.web.multipart.commons包中。例如,在Spring配置文件dispatcher-servlet.xml中配置文件上传解析器,代码如下:
class=”org.springframework.web.multipart.commons. CommonsMultipartResolver”> < property name=”defaultEncoding”value=”gbk”/>//设置编码格式 < property name=”maxUploadSize”value=”50000”/>//限制上传文件大小 < property name=”UploadTempDir”value=”upload/temp”/> //设置临时文件夹
4.2编写文件上传表单界面
Spring实现文件上传时,表单元素的编码类型同样必须设置为multipart/form-data。可以通过Spring框架的form表单标签库定义
成功创建上传文件页面后,可以创建与页面对应的表单类,用于保存页面表单的所有数据。在表单类中上传文件对应的属性类型为MultipartFile,该属性类型与Struts中的FormFile类型相同,封装了上传文件的内容、文件名等信息。
4.3编写文件上传控制器
文件上传控制器继承自SimpleFormController,用于处理页面请求。在该类的构造方法中必须调用setCommandClass()方法设置表单控制器的表单对象类型。在重写父类的onSubmit()方法中,实现处理文件上传的业务。该方法从表单对象中读取用户上传的表单数据,再把上传的文件保存到指定文件夹中,最后返回显示上传成功的视图对象。此外,还需要在Spring配置文件dispatch er-servlet.xml中对其进行配置。
5.文件下载
文件下载服务在很多网站都有,提高了网站的访问量。常用的文件下载技术有组件下载和输出流方式下载。
5.1组件下载
jspSmartUpload组件主要用于实现文件的上传与下载操作。该类的常用方法有:
initialize()方法
该方法有三种重载形式,主要用于实现初始化功能,语法格式略。
upload()方法
该方法用于完成上传文件的准备操作。该方法必须首先调用request对象的getInputStream()方法获取客户端的输入流,之后再通过输入流的read()方法获取用户上传的所有文件数据,并提取出的文件信息封装到File类对象中,最后将File类对象通过File类的addFile()方法添加到File对象中。
downloadFile()方法
该方法实现文件下载功能,该方法有3种重载形式,其语法格式略。
setContentDisposition()方法
该方法用于将数据追加到MIME文件头的CONTENT-DISPOSITION域,将该参数设为null时,组件将自动添加attachment,表示将下载的文件作为附件,浏览器将弹出”文件下载”对话框。
5.2输出流方式下载
通过I/O技术实现文件下载,步骤如下:
获取上传文件的路径,根据该路径创建File对象
String path=request.getParameter(“path”);
path=new String(path.getBytes(“iso-8859-1”));
File file=new File (path);
创建文件字节输入流对象
InputStream in=new FileInputStream (file);
创建输出流对象
OutputStream os=response.getOutputStream ();
循环读取文件
while ((data=in.read ())! =-1)
{os.write (data);}
向指定目录写文件
关闭流
in. close (); out. close ();
例程序源代码因篇幅限制略去。
6结束语
该文介绍了Java Web开发中的jspSmartUpload、commons-fileUpload上传组件,Struts文件上传,String文件上传技术,及组件下载、输出流方式下载技术。由于篇幅所限未给出源程序代码。
参考文献:
[1]王国辉.Java Web开发实战宝典[M].北京:清华大学出版社,2010:650-710.
[2]王黎,于永军,张豪,等.动态网站开发典型案例[M].北京:清华大学出版社,2010:257-285.
[3] MyEclipse.JSP.文件上传下载[EB/OL].http://wenku.baidu.com/view/557b74225901020207409cbc.html.