转载请注明:http://blog.csdn.net/uniquewonderq
问题:在struts2框架下实现文件上传
方案:struts2提供了拦截器可以自动实现文件上传,并且该拦截器存在于defaultStack中,是每个action默认使用的。复用之前的案例。
步骤一:打开上传页面
在struts.xml中,配置打开上传页面的action,代码如下:
</pre><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- package:包,用于对action进行封装 --> <package name="customer" namespace="/customer" extends="struts-default"> <interceptors> <!-- 注册拦截器 --> <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor> <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor> <!-- 注册拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="first"></interceptor-ref> <interceptor-ref name="second"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 设置当前包下所有Action默认引用的拦截器 --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <!-- 打开修改页面 --> <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" > <!-- 引用拦截器 --> <!-- <interceptor-ref name="first"></interceptor-ref> --> <result name="success"> /WEB-INF/customer/update_customer.jsp </result> </action> </package> <!-- 文件上传示例 --> <package name="demo" namespace="/demo" extends="struts-default"> <!-- 打开上传文件页面 --> <action name="toUpload"> <result name="success"> /WEB-INF/jsp/upload.jsp</result> </action> </package> </struts>
在WEB-INF下创建jsp文件夹,并在此文件夹下创建文件上传页面upload.jsp,代码如下:
<%@page pageEncoding="utf-8"%> <html> <head> <body> <form action="" method="post"> <input type="file" name="some"/> <input type="submit" value="提交"> </form> </body> </head> </html>
重新部署并启动tomcat,访问此页面,效果如下图:
点击选择文件后,则就像平时在网站上上传了文件一样。但是此时点击提交并无什么作用。因为我们还没有处理这个请求。
下面进行这方面的处理。
步骤二:导包
上传文件需要依赖新的包commons-io-1.3.2.jar将其引入到项目中后,包结构如下图:
步骤三:Action中处理上传请求
由于Action需要接受拦截器传入的临时文件,并对临时文件进行复制,因此需要提供一个文件操作的工具类FileUtil,代码如下:
package util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileUtil { public static boolean copy(File src,File dest){ BufferedInputStream bufferedInputStream=null; BufferedOutputStream bufferedOutputStream=null; try { bufferedInputStream=new BufferedInputStream(new FileInputStream(src)); bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(dest)); byte[] bts=new byte[1024]; int len=-1; while((len=bufferedInputStream.read(bts))!=-1){ bufferedOutputStream.write(bts,0,len); } return true; } catch (Exception e) { e.printStackTrace(); return false; } finally{ if(bufferedInputStream!=null){ try { bufferedInputStream.close(); } catch (Exception e2) { e2.printStackTrace(); } } if(bufferedOutputStream!=null){ try { bufferedOutputStream.close(); } catch (Exception e3) { e3.printStackTrace(); } } } } }
、然后创建上传文件Action类uploadAction,并根据拦截器传入的临时文件,将其赋值到某路径下。代码如下:
package action; import java.io.File; import org.apache.struts2.ServletActionContext; import util.FileUtil; //文件上传 public class UploadAction { //接受拦截器传入的临时文件 private File some; //接受拦截器注入的原始文件名 private String someFileName; public String execute(){ if(some==null) return "error"; //将文件放于项目部署路径下的upload文件夹下 String path="WEB-INF/upload/"+ someFileName; //根据相对部署路径计算完整路径 path=ServletActionContext.getServletContext().getRealPath(path); //将临时文件复制到上述路径下 FileUtil.copy(some, new File(path)); return "success"; } public File getSome() { return some; } public void setSome(File some) { this.some = some; } public String getSomeFileName() { return someFileName; } public void setSomeFileName(String someFileName) { this.someFileName = someFileName; } }
上述代码中,用意是将文件复制部署的项目路径下的WEB-INF/upload文件夹下, 这样就可以不在项目中写死上传文件的路径了,而是随着部署位置的不同而自动变化,比较灵活,因此这里要求我们在项目中的WEB-INF下创建新的文件夹upload。
步骤四:
在struts.xml中,配置该action,并且设置文件上传的最大值,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- package:包,用于对action进行封装 --> <package name="customer" namespace="/customer" extends="struts-default"> <interceptors> <!-- 注册拦截器 --> <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor> <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor> <!-- 注册拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="first"></interceptor-ref> <interceptor-ref name="second"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 设置当前包下所有Action默认引用的拦截器 --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <!-- 打开修改页面 --> <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" > <!-- 引用拦截器 --> <!-- <interceptor-ref name="first"></interceptor-ref> --> <result name="success"> /WEB-INF/customer/update_customer.jsp </result> </action> </package> <!-- 设置上传文件最大值 --> <constant name="struts.multipart.maxSize" value="5000000"></constant> <!-- 文件上传示例 --> <package name="demo" namespace="/demo" extends="struts-default"> <!-- 打开上传文件页面 --> <action name="toUpload"> <result name="success"> /WEB-INF/jsp/upload.jsp</result> </action> <!-- 上传文件 --> <action name="upload" class="action.UploadAction"> <result name="success">/WEB-INF/jsp/ok.jsp</result> <result name="error">/WEB-INF/jsp/error.jsp</result> </action> </package> </struts>
步骤五:jsp
上述配置中,如果上传成功则转至ok.jsp页面,该页面代码如下:
</pre><pre name="code" class="html"><%@page pageEncoding="utf-8"%> <html> <head> <body> <h1 sytle="color:greed">文件上传成功!</h1> </body> </head> </html>
如果上传失败则转到error.jsp,该页面代码如下:
<%@page pageEncoding="utf-8"%> <html> <head> <body> <h1 style="color:red">文件上传失败!</h1> </body> </head> </html>
修改上传文件页面upload.jsp的表单属性值,代码如下:
<%@page pageEncoding="utf-8"%> <html> <head> <body> <!-- 上传文件对表单有两个要求 1.method="post" 2.enctype="multipart/form-data" --> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="some"/> <input type="submit" value="提交"> </form> </body> </head> </html>
步骤六:测试
重新部署项目并启动tomcat,打开上传文件页面,选择一个文件后点击提交按钮,文件被正确上传到项目部署路径下WEB-INF/upload文件夹下,效果如下图:
提交后,文件上传成功!
我们到 tomcat服务器去查看是否我们的文件提交到了服务器,
如果在下面的页面:
在上面页面直接点击提交,也就是所选文件为空,那么会出现如下
效果:
版权声明:本文为博主原创文章,未经博主允许不得转载。