- struts2的文件上传功能使用的是apache下的commons-fileupload来实现。
- Jsp的表单要求是post提交,并且要求 enctype=”multipart/form-data”
一、单个文件上传
jsp表单
<form action="upload.action" method="post" enctype="multipart/form-data">
file:<input type="file" name="homework"/> <input type="submit" value="submit"/>
</form>
注意此处表单域名(name属性)为 “homework”
action处理类,在Action中需要提供3个属性,一个File 类型,名称是表单域名,其它两个分别是表单域名+FileName,表单域名+ContentType;并且提供get/set方法,如下
public class UploadAction {
// File变量名称与表单name属性,即表单域名一致,变量值为文件
private File homework;
//变量名称为 表单域名+FileName,变量值为文件名称
private String homeworkFileName;
// 变量名称为 表单域名+ContentType,变量值为文件类型
private String homeworkContentType;
public String upload(){
// 设值保存 上传文件 目录
String path = ServletActionContext.getServletContext().getRealPath("/fileUpload");
try {
System.out.println(homework);
System.out.println(homeworkFileName);
System.out.println(homeworkContentType);
System.out.println(path);
FileUtils.copyFile(homework, new File(path, homeworkFileName));
return Action.SUCCESS;
} catch (IOException e) {
System.out.println("file upload error");
e.printStackTrace();
}
return Action.ERROR;
}
public File getHomework() {
return homework;
}
public void setHomework(File homework) {
this.homework = homework;
}
public String getHomeworkFileName() {
return homeworkFileName;
}
public void setHomeworkFileName(String homeworkFileName) {
this.homeworkFileName = homeworkFileName;
}
public String getHomeworkContentType() {
return homeworkContentType;
}
public void setHomeworkContentType(String homeworkContentType) {
this.homeworkContentType = homeworkContentType;
}
}
默认情况下,只允许上上传最大文件为2MB,此时,配置方法如下
<package name="default" namespace="/" extends="struts-default">
<action name="upload" class="com.action.UploadAction" method="upload">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
我们可以自定义文件大小限制,只需在配置文件做修改
<struts>
<!-- 设值上传文件总大小 -->
<constant name="struts.multipart.maxSize" value="1048576000"/>
<!-- 设值上传文件临时目录 -->
<constant name="struts.multipart.saveDir" value="D:\1save"/>
<package name="default" namespace="/" extends="struts-default">
<action name="upload" class="com.action.UploadAction" method="upload">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 设值上传单个文件大小,单位byte -->
<param name="maximumSize">104857600</param>
</interceptor-ref>
<interceptor-ref name="basicStack"/>
</action>
</package>
</struts>
二、批文件上传
批文件上传和单文件上传没啥两样,在处理类中,把三个属性改为数组,处理方法做响应改动,而在配置文件中保持一致,代码如下
public class UploadAction {
// File变量名称与表单name属性,即表单域名一致,变量值为文件
private File homework[];
//变量名称为 表单域名+FileName,变量值为文件名称
private String homeworkFileName[];
// 变量名称为 表单域名+ContentType,变量值为文件类型
private String homeworkContentType[];
public String upload(){
if(homework != null) {
// 设值保存 上传文件 目录
String path = ServletActionContext.getServletContext().getRealPath("/fileUpload");
try {
for (int i = 0; i < homework.length; i++) {
System.out.println(homework[i]);
System.out.println(homeworkFileName[i]);
System.out.println(homeworkContentType[i]);
System.out.println(path);
FileUtils.copyFile(homework[i], new File(path, homeworkFileName[i]));
}
return Action.SUCCESS;
} catch (IOException e) {
System.out.println("file upload error");
e.printStackTrace();
}
}
return Action.ERROR;
}
public File[] getHomework() {
return homework;
}
public void setHomework(File[] homework) {
this.homework = homework;
}
public String[] getHomeworkFileName() {
return homeworkFileName;
}
public void setHomeworkFileName(String[] homeworkFileName) {
this.homeworkFileName = homeworkFileName;
}
public String[] getHomeworkContentType() {
return homeworkContentType;
}
public void setHomeworkContentType(String[] homeworkContentType) {
this.homeworkContentType = homeworkContentType;
}
}
<form action="upload.action" method="post" enctype="multipart/form-data">
file1:<input type="file" name="homework"/><br/>
file2:<input type="file" name="homework"/><br/>
file3:<input type="file" name="homework"/><br/>
<input type="submit" value="submit"/>
</form>