struts2多文件上传

来源:互联网 发布:u盘安装linux卡在scsi 编辑:程序博客网 时间:2024/05/17 09:08
在实际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 ActionSupportimplements 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 border="1" 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>

实现界面: