1.在Struts2的struts.properties文件中,有如下配置,主要用于Struts2上传文件时的上传解析器
#指定使用COS的文件上传解析器
#struts.multipart.parser=cos
#指定使用Pell的文件上传解析器
#struts.multipart.parser=pell
#struts2默认使用Jakarta的Common-FileUpload的文件上传解析器
struts.multipart.parser=jakarta
需要commons-io-1.3.2.jar、commons-fileupload-1.2.1.jar
2.实现文件上传的Action
<form action="upload.action" method="post" enctype="multipart/form-data">
文件标题:<input type="text" name="title" /><br>
选择文件:<input type="file" name="upload" /><br>
<input value="上传" type="submit" />
</form>
Struts2框架负责解析HttpServletRequest请求中的参数,包括文件域,Struts2使用File类型来封装文件域
public class UploadAction extends ActionSupport{
//封装文件标题请求参数的属性
private String title;
//封装上传文件域的属性
private File upload;
//封装上传文件类型的属性
private String uploadContentType;
//封装上传文件名的属性
private String uploadFileName;
//直接在struts.xml文件中配置的属性
private String savePath();
//getter,setter方法,ServletActionContext.getRequest().getRealPath(savePath);
public String execute() throws Exception{
//以服务器的文件保存地址和原文件名建立上传文件输出流
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while((len = fis.read[buffer]) > 0){
fos.write(buffer,0,len);
}
return SUCCESS;
}
}
类型为File的xxx属性封装了该文件域对应的文件内容
类型为String的xxxFileName属性封装了该文件域对应的文件的文件名
类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型
3.配置文件
struts.xml文件中
<action name="upload" class="UploadAction">
<param name="savePath">/upload</param>
<result>/succ.jsp</result>
</action>
web.xml
<!-- 配置Struts2的CleanUp的Filter -->
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.Struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.手动实现文件过滤
UploadAction.java
//定义该Action允许上传的文件类型
private String allowTypes;
//getter,setter方法
//过滤文件类型
public String filterType(String[] type){
//获取希望上传的文件类型
String fileType = getUploadContentType();
for(String type : types){
if(type.equals(fileType)){
return null;
}
}
return INPUT;
}
public String execute() throws Exception{
//将允许上传文件类型的字符串以英文(,)分解成字符串数组
//从而判断当前文件类型是否允许上传
String filterResult = filterType(getAllowTypes().split(","));
//如果当前文件类型不允许上传
if(filterResult != null){
ActionContext.getContext().put("typeError","文件类型不对");
return filterResult;
}
//以服务器的文件保存地址和原文件名建立上传文件输出流
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while((len = fis.read[buffer]) > 0){
fos.write(buffer,0,len);
}
return SUCCESS;
}
5.拦截器实现文件过滤
Struts2提供了一个文件上传的拦截器,通过配置该拦截器可以更轻松地实现文件过滤。Struts2中文件上传的拦截器是fileUpload。
struts.xml文件中
<action name="upload" class="UploadAction">
<!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<param name="allowedType">image/gif,image/jpeg</param>
<!-- 配置允许上传的文件大小 -->
<param name="maximumSize">20000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<param name="savePath">/upload</param>
<result name="input">/input.jsp</result>
<result>/succ.jsp</result>
</action>
struts.multipart.saveDir属性
struts.multipart.maxSize属性