大部分的时候,web应用是不允许浏览者自由上传。这样就需要对上传的文件进行过滤。
1、手动实现文件过滤
在action中定义一个专门用于进行文件过滤的方法,该方法的方法名是任意的,该方法的逻辑就是判断上传文件的类型是否为允许类型。例如增加一个filterTypes()方法,代码简单
public String filterType(String[] types)
{
//获取希望上传的文件类型
String fileType = getUploadContentType();
for (String type : types)
{
if (type.equals(fileType))
{
return null;
}
}
return INPUT;
}
上面的方法判断来上传文件的文件类型是否在允许上传文件类型列表中。为了让应用程序可以动态配置允许上传的文件列表,为该action增加一个allowTypes属性,该属性的值列出了所有允许上传的文件类型。为了可以在struts.xml文件中配置allowTypes属性的值,必须在Action类中提供如下的代码:
private String allowTypes;
//allowTypes属性的setter和getter方法
public String getAllowTypes()
{
return allowTypes;
}
public void setAllowTypes(String allowTypes)
{
this.allowTypes = allowTypes;
}
execute方法在执行相关操作之前,会判断下上传的文件是否允许上传。增加类型判断后的execute方法如下:
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;
}
为了让文件类型检验失败时能够返回input逻辑视图,因此必须为该action中增加逻辑视图配置。
对应的struts.xml配置如下:
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<action name="upload" class="lee.UploadAction">
<!-- 设置允许上传的文件类型 -->
<param name="allowTypes">image/bmp,
image/png,image/gif,image/jpeg</param>
<!-- 动态设置Action的属性值 -->
<param name="savePath">/upload</param>
<!-- 上传失败后退回input逻辑视图 -->
<result name="input">/upload.jsp</result>
<!-- 配置Struts 2默认的视图页面 -->
<result>/succ.jsp</result>
</action>
<action name="">
<result>.</result>
</action>
</package>
我们可以在该页面中使用如下的代码输出错误提示:
<span style="color:red">${requestScope.typeError}</span>
如果需要实现文件大小的过滤,与文件类型的过滤是一样的。虽然上面的Action类中并没有方法直接获取上传文件的大小,但是Action中包含了一个类型为File的属性,该属性封装来文件域对应的文件内容;而File类中有一个length()方法,该方法可以返回文件的大小,通过比较可以判断文件的大小是否符合要求。
2、使用拦截器实现文件过滤
struts 提供来一个文件上传的过滤器fileUpload,为了让拦截器生效,只需要在action中配置一下就行来。
struts.xml
<action name="upload" class="lee.UploadAction">
<!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<param name="allowedTypes">image/bmp,image/png,
image/gif,image/jpeg</param>
<!-- 配置允许上传的文件大小 -->
<param name="maximumSize">2000</param>
</interceptor-ref>
<!-- 配置系统默认的拦截器 -->
<interceptor-ref name="defaultStack"/>
<!-- 动态设置Action的属性值 -->
<param name="savePath">/upload</param>
<!-- 配置input逻辑视图对应的视图页面 -->
<result name="input">/upload.jsp</result>
<!-- 配置Struts 2默认的视图页面 -->
<result>/succ.jsp</result>
</action>
<action name="">
<result>.</result>
</action>