您的位置:首页 > 编程语言 > Java开发

struts2之如何向服务器上传文件

2015-07-25 18:53 393 查看
转载请注明: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服务器去查看是否我们的文件提交到了服务器,



如果在下面的页面:





在上面页面直接点击提交,也就是所选文件为空,那么会出现如下

效果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: