Struts2上传单文件或者多个文件的好处

问题?Struts2上传单文件或者多个文件的好处在哪里呢?我们都知道上传文件的基本步骤都是读取文件域,得到文件名,然后得到真实存储路径,然后再构建输入输出流,这样几个步骤,我们的文件上传也就搭成了。显得有些麻烦了是吧?接下来让我们去看看,struts2给我们带来的便利。


原理:struts2拥有自动转换类型的功能,这是好处一。struts2我们所拷入的common-io.jar包集成了一个工具类,运用这个工具类可以帮我们达到上传文件的目的。

*首先搭建好struts2的环境(7个jar包,拦截器之类的配置),详情可看:http://blog.csdn.net/mr_li13/article/details/49391329?

案例:运用struts2肯定要用它的配置文件struts.xml啦、

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
			"-//Apache Software Foundation//DTD Struts Configuration <span style="color:#ff0000;">2.0</span>//EN"
			"http://struts.apache.org/dtds/struts-<span style="color:#ff0000;">2.0</span>.dtd">
			
<struts>
<!-- constant表示常量设置,设置配置文件自动更新,开发中很重要 -->
<constant name="struts.action.extension" value="action,,do"></constant>
<constant name="struts.devMode" value="true"></constant>

<!-- 各个配置文件的包含 -->

<!-- 单个文件下载action -->
<include file="UpLoadFile.xml"></include>

<!-- 多个文件上传action -->
<include file="moreUpLoadFile.xml"></include>


</struts>
			

红色标记处。一定要相同。不然就会出不联网就会报错。详情请看

1.单个文件:

UpLoadFile.xml文件内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
			"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
			"http://struts.apache.org/dtds/struts-2.0.dtd">
			
<struts>
<!-- constant表示常量设置,设置配置文件自动更新,开发中很重要 -->
<constant name="struts.action.extension" value="action,,do"></constant>
<constant name="struts.devMode" value="true"></constant>
<!-- 设置文件上传大小 50M-->
<constant name="struts.multipart.maxSize" value="52428800"></constant>
 
 <!-- 文件下载action -->
<package name="upload" namespace="/upload" extends="struts-default">
	<action name="upload1" class="com.itcast.web.domain.uploadAction" method="execute">
		<result name="success">/uploadSuccess.jsp</result>
	</action>
</package>

</struts>

上传页面:upload.jsp

<!-- 于http://localhost:8080/Struts2day1/upload.jsp -->
    <form action="${pageContext.request.contextPath}/upload/upload1.action" method="post" enctype="multipart/form-data">
    	文件:<input type="file" name="img"/><br/><!-- name这个名字必须和action类中的setter名字相同,首先执行setter方法,struts2会自动封装 -->
    		<input type="submit" value="上传"/>
    </form>

action实体类:uploadAction.class

package com.itcast.web.domain;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

import javax.servlet.ServletContext;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class uploadAction extends ActionSupport implements Serializable {
	private File img;//代表表单中文件上传输入域的名称,struts会自动封装成file域在此进行处理
	private String imgFileName;
	//得到上传域中,文件的名字,是不是很方便啊,struts已经为我们做好了
	//只需要与File的对象名称多FileName就可以了,而且文件名的编码格式已经转化好了
	private String imgContentType;//同理封装好了一个文件类型类
	
	
	/**
	 * @return
	 *  <interceptor name="fileUpload" 
	 *  class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
	 *  
	 *  整个的文件封装全部都是靠struts2-core这个包中的struts-default.xml这个文件中的衣裳拦截器实现的
	 */
	public File getImg() {
		return img;
	}

	public void setImg(File img) {
		this.img = img;
	}

	
	
	public String getImgFileName() {
		return imgFileName;
	}

	public void setImgFileName(String imgFileName) {
		this.imgFileName = imgFileName;
	}

	public String getImgContentType() {
		return imgContentType;
	}

	public void setImgContentType(String imgContentType) {
		this.imgContentType = imgContentType;
	}
	
	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 * 处理文件上传业务
	 */
	
	public String execute(){
//		我们自然用最新的方式。简便许多
		try {
			
					System.out.println(imgContentType);//image/jpeg
			
			//找到文件存放路径
			ServletContext sc=ServletActionContext.getServletContext();
			String storpath=sc.getRealPath("files");
			//老方式
			//构建输出流
//			OutputStream out=new FileOutputStream(storpath+"\\"+imgFileName);
//			InputStream in=new FileInputStream(img);
//			
//			byte b[]=new byte[1024];
//			int len=-1;
//			while((len=in.read(b))!=-1){
//				out.write(b, 0, len);
//			}
//			out.close();
//			in.close();
			
			//新方式,用拷入的jar包commons-io这个jar包,
			//里面有封装的一个类,使我们上传文件更容易(前者是文件源,后者是路径(主路径,子路径))
			FileUtils.copyFile(img, new File(storpath, imgFileName));
			
			ActionContext.getContext().put("message", "上传成功!");
			return SUCCESS;
			
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}
}

成功页面:uploadSuccess.jsp

<body>
    ${message }
  </body>

2.多文件上传

其实方式都差不多只是将实体类中的属性变成了数组形式

moreUploadFile.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
			"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
			"http://struts.apache.org/dtds/struts-2.0.dtd">
			
<struts>
<!-- constant表示常量设置,设置配置文件自动更新,开发中很重要 -->
<constant name="struts.action.extension" value="action,,do"></constant>
<constant name="struts.devMode" value="true"></constant>
<!-- 设置文件上传大小 50M-->
<constant name="struts.multipart.maxSize" value="52428800"></constant>
<package name="moreupload" namespace="/moreupload" extends="struts-default">
	<action name="upload1" class="com.itcast.web.domain.moreUploadAction" method="execute">
		<result name="success">/uploadSuccess.jsp</result>
	</action>
</package>
</struts>

moreupload.jsp

<!-- http://localhost:8080/Struts2day1/upload.jsp -->
    <form action="${pageContext.request.contextPath}/moreupload/upload1.action" method="post" enctype="multipart/form-data">
    	文件1:<input type="file" name="img"/><br/><!-- name这个名字必须和action类中的setter名字相同,首先执行setter方法,struts2会自动封装 -->
    	文件2:<input type="file" name="img"/><br/>
    		<input type="submit" value="上传"/>
    </form>

实体类:moreUploadAction.class

package com.itcast.web.domain;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

import javax.servlet.ServletContext;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author Administrator
 *多文件上传案例
 */
public class moreUploadAction extends ActionSupport implements Serializable {
	private File[] img;//代表表单中文件上传输入域的名称,struts会自动封装成file域在此进行处理
	private String[] imgFileName;
	//得到上传域中,文件的名字,是不是很方便啊,struts已经为我们做好了
	//只需要与File的对象名称多FileName就可以了,而且文件名的编码格式已经转化好了
	private String[] imgContentType;//同理封装好了一个文件类型类
	
	
	
	
	public File[] getImg() {
		return img;
	}

	public void setImg(File[] img) {
		this.img = img;
	}

	public String[] getImgFileName() {
		return imgFileName;
	}

	public void setImgFileName(String[] imgFileName) {
		this.imgFileName = imgFileName;
	}

	public String[] getImgContentType() {
		return imgContentType;
	}

	public void setImgContentType(String[] imgContentType) {
		this.imgContentType = imgContentType;
	}

	public String  execute(){
		try {
			if(img!=null&&img.length>0){
			ServletContext sc=ServletActionContext.getServletContext();
			String storpath=sc.getRealPath("files");
			
			for(int i=0;i<img.length;i++){
					FileUtils.copyFile(img[i], new File(storpath, imgFileName[i]));
				}
			}
			
			ActionContext.getContext().put("message", "上传成功!");
			return SUCCESS;
	
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
			}
	}
}

成功页面和uploadSuccess.jso内容一样的,共用。


效果图:



总结:



需要看更多关于文件上传的内容,可以看所搭建的环境中的common-io.jar中或者struts-core.jar中的org/Apache.strutd中的default.properties文件




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值