看这篇文章之前,建议先看看单个文件上传的实现十一、Struts2上传文件
下面直接在原来工程的基础上,实现支持批量上传的功能。
修改User类
添加多一个集合,用于保存批量上传文件的相对路径
public class User {
private String name;
private Integer age;
private String image;//保存单个文件上传的相对路径
private List<String> images;//保存批量文件上传的相对路径
//get set方法...
}
修改UploadAction
添加批量上传的代码
package blog.csdn.net.web.action;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import blog.csdn.net.domain.User;
import blog.csdn.net.utils.UploadUtils;
public class UploadAction extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = 1L;
//模型驱动注入值
private User user = new User();
@Override
public User getModel() {
return user;
}
/**
* 单文件上传
* 通过属性驱动注入3个值
* 文件上传相关的3个属性 ,struts2会自动注入
* 上传的文件 : 属性名与表单中file的name属性名一致
* 上传的文件名:属性名前段是name属性名一致+FileName;
* 上传的文件类型: 属性名前段是name属性名一致 + ContentType;
*/
private File upload; // 表单的name是upload
private String uploadFileName; // 文件名
private String uploadContentType;// 文件类型
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
/**
* 批量文件上传,和单文件上传类似,只需要将那3个属性变成数组即可
*/
private File[] mulitupload; // 表单的name是mulitupload
private String[] mulituploadFileName; // 文件名
private String[] mulituploadContentType;// 文件类型
public void setMulitupload(File[] mulitupload) {
this.mulitupload = mulitupload;
}
public void setMulituploadFileName(String[] mulituploadFileName) {
this.mulituploadFileName = mulituploadFileName;
}
public void setMulituploadContentType(String[] mulituploadContentType) {
this.mulituploadContentType = mulituploadContentType;
}
public String upload() throws IOException {
//单文件上传
if (null != this.uploadFileName) {
// 说明有文件需要上传
String filename = UploadUtils.getUUIDName(this.uploadFileName);
// 保存到tomcat目录下
String uploadDidr = "E:\\apache-tomcat-7.0.52\\webapps\\upload";
// 保存上传的文件
FileUtils.copyFile(upload, new File(uploadDidr, filename));
//保存文件到User中,只保存相对路径,外部访问的时候可以拼上tomcat服务器的地址
user.setImage("/upload/"+filename);
}
// 批量文件上传
if (null != this.mulituploadFileName) {
// 保存到tomcat目录下
String uploadDidr = "E:\\apache-tomcat-7.0.52\\webapps\\upload";
//保存上传的文件浏览路径
List<String> images = new ArrayList<>();
HttpServletRequest request = ServletActionContext.getRequest();
//循环读写文件
for (int i = 0; i < mulituploadFileName.length; i++) {
//uuid处理后的文件名
String filename = UploadUtils.getUUIDName(mulituploadFileName[i]);
//需要上传的文件
File file = mulitupload[i];
// 保存上传的文件,通过apache提供的工具类来操作
FileUtils.copyFile(file, new File(uploadDidr, filename));
// 保存文件到User中,只保存相对路径,外部访问的时候可以拼上tomcat服务器的地址
String image = "/upload/"+filename;
images.add(image);
user.setImages(images);
}
}
//下面的操作就是调业务层的代码将user的数据进行保存,例如userService.save(user);
//我这里没有集成hibernate,所以就直接通过控制台来查看了
System.out.println(user);
//回写结果
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("提交成功!!");
return NONE;
}
}
修改struts.xml
修改配置文件,让其支持gif,mp4的提交
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置上传文件的总大小,默认是2M struts.multipart.maxSize=2097152,现在修改成最大20M -->
<constant name="struts.multipart.maxSize" value="20971520"/>
<package name="default" namespace="/" extends="struts-default">
<action name="*" class="blog.youkuaiyun.com.web.action.UploadAction" method="{1}">
<!-- 配置input结果错误的页面-->
<result name="input" type="redirect">/msg.jsp</result>
<!-- 引入默认的拦截器 -->
<interceptor-ref name="defaultStack">
<!-- 决定上传文件的类型 -->
<param name="fileUpload.allowedExtensions">.jpg,.png,.gif,.mp4</param>
</interceptor-ref>
</action>
</package>
</struts>
修改index.jsp
添加批量上传的表单
<form action="${pageContext.request.contextPath}/upload" method=post
enctype="multipart/form-data">
姓名:<input type="text" name="name"> <br />
年龄:<input type="text" name="age"> <br />
文件1:<input type="file" name="mulitupload"> <br />
文件2:<input type="file" name="mulitupload"> <br />
文件3:<input type="file" name="mulitupload"> <br />
文件4:<input type="file" name="mulitupload"> <br />
<input type="submit" value="提交">
</form>
测试
访问项目主页,选择好要上传的文件
提交成功
控制台也输出我们提交的内容
查看上传目录
可以看到我们刚刚提交的4个文件都成功了.
搞定~~