手动实现文件过滤
大部分时候,Web应用不允许浏览者自由上传,尤其不能允许上传可执行性文件——因为可能是病毒程序。通常,我们可以允许浏览者上传图片,上传压缩文件等;除此之外,还必须对浏览者上传的文件大小进行限制。因此必须在文件上传中进行文件过滤。
从上面的Action中可以看出,Action内有两个方法分别用于获取文件类型和文件大小,为了实现文件过滤,完全可以通过判断这两个方法的返回值来实现文件过滤。 为了让上面的Action增加文件过滤的功能,在上面的Action中增加如下的方法:
/**
* 过滤文件类型
* @param types 系统所有允许上传的文件类型
* @return 如果上传文件的文件类型允许上传,返回null,否则返回input字符串
*/
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类中提供如下代码:
//定义该Action允许上传的文件类型
private String allowTypes;
//allowTypes属性的setter和getter方法
public String getAllowTypes()
{
return allowTypes;
}
public void setAllowTypes(String allowTypes)
{
this.allowTypes = allowTypes;
}
下面就可以在是实现该Action的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;
}
上面的Action类代码非常简单,它包含的execute方法先判断当前文件类型是否是允许上传的文件类型,如果该文件类型不允许上传,则返回input逻辑视图名;只有当该文件的类型是允许上传的文件类型时,才真正执行文件上传逻辑。
为了让文件类型检验失败时能返回input逻辑视图,因此必须为该Action增加input逻辑视图配置,
下面是该Action的配置文件代码。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 指定国际化资源文件的baseName为globalMessages -->
<constant name="struts.custom.i18n.resources" value="globalMessages"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<action name="upload" class="lee.UploadAction">
<!-- 通过动态设置allowTypes的属性来动态指定允许上传的文件类型 -->
<param name="allowTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<!-- 动态设置Action的属性值 -->
<param name="savePath">/upload</param>
<!-- 配置Struts2默认的视图资源 -->
<result>/succ.jsp</result>
<!-- 配置该应用的input逻辑视图 -->
<result name="input"> /upload.jsp</result>
</action>
</package>
</struts>
通过上面的配置看出,上面文件类型仅能上传各种类型的图片文件,如果试图上传其他类型的文件,系统将转入input逻辑视图,该逻辑视图就是upload.jsp页面,该页面中使用如下代码输出错误提示:
<!-- 使用表达式语言输出错误提示 -->
如果试图上传非图片类型的文件,可以看到出错提示,提示用户不要上传非图片类型的文件
通过上面的介绍,我们可以更轻易地完成了文件类型的过滤。
如果需要实现文件大小过滤,与实现文件类型过滤的方法基本相似。虽然在上面的Action类中并没有方法直接获取上传文件的大小,但Action中包含了一个类型为File的属性,该属性封装了文件域对应的文件内容,而File类有一个length()方法,该方法可以返回文件的大小,通过比较该文件的大小和允许上传的文件大小,从而决定是否允许上传该文件。
拦截器实现文件过滤
上面手动实现文件过滤的方式虽然简单,但毕竟需要书写大量的过滤代码,不利于程序的高层次解构,而且开发复杂。
Struts2提供了一个文件上传的拦截器,通过配置该拦截器可以更轻松的实现文件过滤。Struts2中文件上传的过滤器是fileUpload,为了让该拦截器起作用,只需要在该Action配置该拦截器引用即可。
配置fileUpload拦截器时,可以为其指定两个参数:
allowedTypes:该参数指定允许上传的文件类型,多个文件类型之间以英文逗号(,)隔开。
maximumSize:该参数指定允许上传的文件大小,单位是字节。
通过配置fileUpload的拦截器,可以更轻易的实现文件过滤,当文件过滤失败后,系统自动转入input逻辑视图,因此必须为该Action配置名为input的逻辑视图。除此之外,还必须显式地为该Action配置defaultStack的拦截器引用。
通过拦截器来实现文件过滤的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 指定国际化资源文件的baseName为globalMessages -->
<constant name="struts.custom.i18n.resources" value="globalMessages"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<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>
<!-- 配置Struts2默认的视图资源 -->
<result>/succ.jsp</result>
<!-- 配置该应用的input逻辑视图 -->
<result name="input">/upload.jsp</result>
</action>
</package>
</struts>
上面的拦截器过滤不仅过滤了文件的类型,也过滤了文件大小。上传文件的类型只能是图片文件,且文件大小不能大于2000字节(当然,我们随时可以更改到更大)。如果我们上传文件的文件太大,系统将转入input的逻辑视图,也就是/upload.jsp页面。
分享到:
相关推荐
以下是对Struts2中文件上传及`codeFilter`的详细解释: **1. Struts2文件上传机制** Struts2提供了内置的支持来处理文件上传,主要利用了Apache Commons FileUpload库。在Struts2的Action类中,可以定义一个字段,...
本篇文章将详细介绍如何在Struts2中实现文件上传功能以及使用过滤器进行文件类型的过滤。 首先,理解Struts2文件上传的基本原理。Struts2提供了`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器来...
在Struts2中,文件上传功能是常见的需求,比如用户可能需要上传个人照片、文档等。然而,为了确保系统安全性和资源管理,我们需要对上传的文件进行过滤,限制文件类型和大小。以下是对这个主题的详细讲解。 **一、...
在Struts2中,文件上传主要依赖于Apache Commons FileUpload库。开发者需要在Action类中创建适当的字段来接收文件,并使用Struts2的`@FileUpload`注解或`CommonsFileUploadInterceptor`拦截器来处理文件。文件下载则...
3. **Action配置**:在Struts2的配置文件(struts.xml)中,定义一个处理文件上传的Action,指定`params`拦截器,确保表单数据能被正确解析。 4. **处理文件**:在Action类中,使用`CommonsFileUpload`库(Apache ...
在Struts2中,文件上传功能是一个常见的需求,例如用户可能需要上传图片、文档或其他类型的文件。本教程将深入浅出地讲解如何在Struts2中实现文件上传,并提供一个简单的实例来帮助理解。 1. **Struts2文件上传概述...
### 在Struts 2中实现文件上传的知识点详解 #### 实现原理 在Struts 2框架中,文件上传功能的实现主要依赖于`CommonsFileUpload`组件。`CommonsFileUpload`通过将HTTP请求中的数据部分保存到服务器端的临时文件夹...
在Struts2中可以通过配置文件上传拦截器(`fileUpload`)来实现对上传文件的大小限制以及文件类型的过滤。在`struts.xml`配置文件中添加如下配置: ```xml <param name="maximumSize">2MB</param> <!-- 最大文件...
总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...
在Struts2中,当FileUpload组件将文件保存到服务器时,会用到这些IO操作。此外,它还包含了一些高级功能,如文件过滤、流转换等,可以极大地简化文件操作的复杂性。 在Struts2框架中,文件上传通常涉及以下步骤: ...
Struts2多文件上传是Java Web开发中常见的一项功能,用于允许用户一次上传多个文件。在Struts2框架中,实现这一功能涉及到一系列的技术和步骤。以下是对这一知识点的详细说明: 1. **Struts2框架**:Struts2是一个...
使用Struts2实现手动过滤文件上传的类型和大小 为了确保安全,通常需要限制上传文件的类型和大小。可以通过自定义拦截器或者在Action中实现检查。例如,可以检查文件扩展名,限制文件大小,甚至读取文件内容进行更...
本文将深入探讨Struts1中的文件上传,包括单文件上传、多文件上传,以及解决文件名乱码和重名冲突等问题。 1. **文件上传基础** 文件上传是Web应用中常见的一种功能,允许用户从本地电脑上传文件到服务器。在...
标题中的“K8_Struts2_EXP S2-045 & 任意文件上传 20170310”指的是一个与Struts2框架相关的安全漏洞,具体为S2-045漏洞,该漏洞允许攻击者进行任意文件上传。20170310可能是漏洞被发现或公开的日期,也可能是指该...
在Struts2框架中,实现文件上传主要依赖于表单的`enctype`属性设置为`multipart/form-data`。这种设置允许表单中的文件作为请求的一部分发送到服务器端。 **1.2 enctype详解** - **application/x-...
在Struts2中,你需要创建一个Action类来处理文件上传请求。这个Action类需要继承`org.apache.struts2.dispatcher.multipart.MultiPartRequest`,以便处理多个文件。同时,定义相应的私有属性,这些属性将用于接收...
在Struts2中,实现文件上传涉及多个组件和技术。以下是关于"Struts2 文件上传源码"的相关知识点: 1. **.struts2的动作类(Action Class)**:在Struts2中,文件上传通常通过自定义Action类来处理。Action类是业务...
在Struts2中,文件上传功能是一项常用的功能,允许用户通过Web表单上传文件到服务器。这篇博客文章(遗憾的是,由于没有直接提供具体内容,我无法提供更详细的博客内容摘要),可能详细介绍了如何在Struts2框架中...
在本篇文章中,我们将深入探讨Struts2中文件上传的工作原理、实现方法以及相关注意事项。 首先,我们来看一下Struts2文件上传的基本流程: 1. 用户通过HTML表单选择本地文件,并提交到服务器。 2. Struts2拦截器...