天天看点

struts2多文件上传

在实际web开发中,文件上传几乎在每个模块都要涉及到,比如注册账户要上传头像之类的。上传头像一般涉及到的都是单文件上传,而当要上传一些附件时,往往需要实现多文件上传。

多文件上传思路:

思路一:使用数组实现多文件上传,使用数组实现多文件上传时,只需要将File upload、String uploadContentType和String uploadFileName分别改成它们的数组形式,然后在上传文件时使用for循环一一实现数组中所有文件的单文件上传。

思路二:使用集合实现多文件上传,使用集合实现多文件上传时,只需要将File upload、String uploadContentType和String uploadFileName分别改成它们的List集合形式形式,然后在上传文件时使用for循环遍历集合中所有文件一一进行单文件上传。

这里以使用数组实现多文件上传为例(使用集合实现是一样的):

上传页面index.jsp:

<h2>多文件上传</h2>
<s:form action="ArrayManyFileUploadAction!uploadManyFile.action" method="post" enctype="multipart/form-data">
<s:textfield name="uname" label="姓名"></s:textfield>
<s:file name="upload" label="文件一"></s:file>
<s:file name="upload" label="文件二"></s:file>
<s:file name="upload" label="文件三"></s:file>
<s:submit value="确认上传"></s:submit>
</s:form>
           

所有action的父类:BaseAction.jsp:

package com.web.action;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

//所有action的父类
public class BaseAction extends ActionSupport
		implements ServletRequestAware, ServletResponseAware, SessionAware, ApplicationAware {
	HttpServletRequest request;
	HttpServletResponse response;
	Map<String, Object> session;
	Map<String, Object> application;

	public void setApplication(Map<String, Object> arg0) {
		this.application = arg0;
	}

	public void setSession(Map<String, Object> arg0) {
		this.session = arg0;
	}

	public void setServletResponse(HttpServletResponse arg0) {
		this.response = arg0;
	}

	public void setServletRequest(HttpServletRequest arg0) {
		this.request = arg0;
	}
}
           

多文件上传使用的action:ArrayManyFileUploadAction.java:

package com.web.action;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

//实现多文件上传的Action
@SuppressWarnings("serial")
public class ArrayManyFileUploadAction extends BaseAction {
	private String uname; // 上传文件人的名称
	private File[] upload; // 上传的文件域的属性
	private String[] uploadContentType; // 上传文件的类型
	private String[] uploadFileName; // 上传文件的名称
	private String savePath; // 上传文件保存的路径
	// 以上五个属性的set和get方法省略
	private Date createTime; // 上传时间
	// 使用数组实现多文件上传的类

	public String uploadManyFile() {
		for (int i = 0; i < upload.length; i++) {
			// 获取文件保存完整路径
			String path = request.getSession().getServletContext().getRealPath("/") + "upload/" + uploadFileName;
			File target = new File(path);
			copy(this.upload[i], target);
		}
		return SUCCESS;
	}

	// 将上传的文件复制到目标文件中
	private static void copy(File source, File target) {
		// 创建输入流,接收页面传过来的文件
		InputStream in = null;
		// 创建输出流,接收输入流传过来的文件
		OutputStream out = null;
		try {
			// 实例化输入流
			in = new BufferedInputStream(new FileInputStream(source));
			// 实例化输出流
			out = new BufferedOutputStream(new FileOutputStream(target));
			// 创建文件缓冲区
			byte[] buffer = new byte[1024];
			// 创建临时参数对象
			int len = 0;
			// 循环将输入流中的文件写入到输出流中
			while ((len = in.read(buffer)) > 0) {
				// 将内容以字节形式写入
				out.write(buffer, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					System.out.println("关闭输入流失败!");

					e.printStackTrace();
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					System.out.println("关闭输出流失败!");
					e.printStackTrace();
				}
			}
		}
	}

	public Date getCreateTime() {
		createTime = new Date();
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
}
           

上传成功显示界面:success.jsp:

<h2>上传成功界面</h2>
上传者:${uname}
<table  cellpadding="0" cellspacing="0" width="50%">
<tr>
<td>上传文件</td>
<td>上传时间</td>
</tr>
<s:iterator status="st" value="uploadFileName">
<tr>
<td><s:property value="uploadFileName[#st.getIndex()]" /></td>
<td><s:date name="createTime" format="yyyy-MM-dd HH:mm:ss" /></td>
</tr>
</s:iterator>
</table>
           

struts.xml配置文件:

<struts>
<constant name="struts.devMode" value="false"></constant>
<!-- 配置包元素 -->
<package name="default" extends="struts-default" namespace="/">
<action name="ArrayManyFileUploadAction" class="com.web.action.ArrayManyFileUploadAction">
<!-- 使用fileUpload拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 制定允许上传文件的大小 -->
<param name="maximumSize">1024*1024*10</param>
</interceptor-ref>
<!-- 配置默认系统拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<param name="savePath">/upload</param>
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
           

实现界面:

struts2多文件上传
struts2多文件上传

继续阅读