标签:
转载请注明: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服务器去查看是否我们的文件提交到了服务器,
如果在下面的页面:
在上面页面直接点击提交,也就是所选文件为空,那么会出现如下
效果:
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/uniquewonderq/article/details/47057641