首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

使用Struts1实现文件下传(一)

2012-10-09 
使用Struts1实现文件上传(一)????? 今天研究了一下Struts的文件上传机制,可以方便的将客户端文件上传至服

使用Struts1实现文件上传(一)

????? 今天研究了一下Struts的文件上传机制,可以方便的将客户端文件上传至服务器端,感觉很方便、实用,特此记录一下。

????? 完成文件上传功能大致需要以下几个步骤:

??????

???? (1)创建用于文件上传的JSP页面;

???? (2)创建用于承载数据的ActionForm;

???? (3)创建用于处理上传的Action;

???? (4)配置文件上传大小;

???? (5)配置从web.xml文件中读取文件存放路径;

?

步骤一:创建用于文件上传的JSP页面

?

????? 在项目中新建一个用于文件上传的JSP页面,如命名为:FileUpload.jsp,在页面的顶头处引入Struts的html标签库。

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>?

????? 并在页面的<body></body>标签内书写如下代码:

<html:form enctype="multipart/form-data" action="/fileUpload" method="post">          <html:file property="uploadFile"></html:file>          <html:submit>Upload File</html:submit></html:form>?

????? <html:form>是Struts表单,要想用此表单上传文件必须要设置 enctype 和 method 参数才行,enctype 参数用于设置该表单的编码方式,当该表单中包含了<input type = "file"> 或 <html:file> 是必须要将enctype的属性值设置为:"multiparty/form-data"? ,并且要将表单的提交方式Method属性设置为"Post" ;在action处填入处理表单的Action访问路径。

????? <html:file>是Struts提供的文件上传组件,其属性property要与承载数据的ActionForm类的FormFile类型的属性保持一一对应的关系。ActionForm类中的属性书写见步骤二。

?

步骤二:创建用于承载数据的ActionForm

?

????? 在项目中新建一个ActionForm的子类,如命名为:FileUploadForm.java,在其中新增一个FormFile类型的属性uploadFile,并设置getter、setter方法。

import org.apache.struts.upload.FormFile;private FormFile uploadFile;          public FormFile getUploadFile() {          return uploadFile;}          public void setUploadFile(FormFile uploadFile) {          this.uploadFile = uploadFile;}?

????? 在Struts中,一个FormFile类型的对象对应Form表单中创送的一个文件,Struts将上传的文件信息封装金FormFile中,通过FormFile提供的方法可以方便的进行文件的操作。其实FormFile是一个接口,位于 org.apache.struts.upload.FormFile 中,它定义了操作上传文件的基本方法。

????? FormFile接口定义的常用方法:

????? (1) getFileName()/setFileName()???//用于获取或设置文件名;

????? (2) getFileSize() / setFileSize()????? //用于获取或设置文件字节数;

????? (3) getFileData()?????????????????????????? //用于获取文件的字节数组,用于小的文件;

????? (4) getInputStream()??????????????????? //用于获取文件的输入流,用于较大的文件;

??????(5) destory()???????????????????????????????? //销毁FromFile;

?

步骤三:创建用于处理上传的Action

?

????? 在项目中新建一个Action的子类,如命名为:FileUploadAction.java,在其execute方法中添加处理代码。

public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {FileUploadForm fileUploadForm = (FileUploadForm) form;FormFile uploadFile = fileUploadForm.getUploadFile();try {FileOutputStream outer = new FileOutputStream("d:\"+uploadFile.getFileName());byte[] buffer = uploadFile.getFileData();outer.write(buffer);outer.close();uploadFile.destroy();} catch (Exception e) {e.printStackTrace();}return null;}

????? 在代码中可以看到,我们从FileUploadForm中找到了FormFile类型的属性,通过其提供的方法得到文件的信息,并将其存入服务器的磁盘中。在保存的过程中需要用到文件流的一些基本操作。

?

??????到此为止,文件的上传已经基本成功,剩下的两步为配置文件上传大小和从web.xml文件中读取文件存放路径,可以选择学习。

?

步骤四:配置文件上传大小

?

????? 在Struts中可以配置上传文件的大小,以避免服务器的硬盘消化不良。

????? 打开项目中WebRoot\WEB-INF\struts-config.xml ,切换至源码视图,在其中添加如下节点信息,便可以控制上传文件的大小了。

<controller maxFileSize="8K"></controller>

????? 其中maxFileSize属性的单位可以是K,也可以是M或G;

????? 注意:操作struts-config.xml文件时应当特别注意各个节点间的顺序,因为Struts要求配置文件的各个元素顺序有一定的要求,顺序一旦被打乱,也就意味着web容器即将进入瘫痪状态,因此在添加<controler>节点时,要将此节点添加在<action-mapping>和<message-resources>节点之间。

?????附:Struts-config.xml配置文件各元素的顺序列表。

The content of element type "struts-config" must match "(display-name?,description?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)".

?

?步骤五:配置从web.xml文件中读取文件存放路径

?

?????? 在步骤三中的代码中我们已经看到,在保存文件时,我写的是一个固定的存放路径,有没有什么办法让它动态改变呢?答案是肯定的,Struts提供了一些方法可以读取web.xml中读取数据,那么我们可以把存放的路径存放在web.xml文件中,存储文件时再将路径读取出来。这样做的好处是,如果存放路径发生改变,我们只需要修改配置文件,而不需要改动代码。

?

?????? 打开项目WebRoot\WEB-INF\web.xml , 找到一个servlet,在该servlet的节点下添加如下代码:

<init-param>  <param-name>path</param-name>  <param-value>d:\uploadFolder\</param-value></init-param>

?????? 要想读取此节点的信息,在处理上传文件的Action代码中加入如下代码:

//以下两行代码任选其一;String path = this.getServlet().getInitParameter("uploadpath");String path = this.getServlet().getServletConfig().getInitParameter("uploadpath")

?

?????? 到此基于Struts的文件上传操作已经基本完成。

?

?

????? (完) xusweeter @ 2010年8月5日 晚 21:45

?

?

?

?

?

?

?

?

?

?

        

热点排行