在实际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>
实现界面:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9EFVNJzYtJGboJTW1ZUbaZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jM0AzN1AzMxIjMxcDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)