大部分时候,Web应用不允许浏览者自由上传,尤其不能允许上传可执行性文件——因为可能是病毒程序。通常,我们可以允许浏览者上传图片、上传压缩文件等;除此之外,还必须对浏览者上传的文件大小进行限制。因此必须在文件上传中进行文件过滤。
从上面的Action中可以看出,Action内有两个方法分别用于获取文件类型和文件大小。为了实现文件过滤,完全可以通过判断这两个方法的返回值来实现文件过滤。在这种方式下,程序员获取全部的过滤控制权利。
如果需要手动实现文件过滤,可按如下步骤进行。
在Action中定义一个专用于进行文件过滤的方法,该方法的方法名字是任意的,该方法的逻辑就是判断上传文件的类型是否为允许类型。例如增加filterTypes()方法,方法代码如下。
程序清单:codes\04\4.3\codeFilter\WEB-INF\src\org\crazyit\app\action\UploadAction.java
- /**
- * 过滤文件类型
- * @param types 系统所有允许上传的文件类型
- * @return 如果上传文件的文件类型允许上传,
- * 返回null,否则返回error字符串
- */
- public String filterTypes(String[] types)
- {
- //获取希望上传的文件类型
- String fileType = getUploadContentType();
- for (String type : types)
- {
- if (type.equals(fileType))
- {
- return null;
- }
- }
- return ERROR;
- }
上面的方法判断了上传文件的文件类型是否在允许上传文件类型列表中。为了让应用程序可以动态配置允许上传的文件列表,为该Action增加了一个allowTypes属性,该属性的值列出了所有允许上传的文件类型。为了可以在struts.xml文件中配置allowTypes属性的值,必须在Action类中提供如下代码。
程序清单:codes\04\4.3\codeFilter\WEB-INF\src\org\crazyit\app\action\UploadAction.java
- //定义该Action允许上传的文件类型
- private String allowTypes;
- //allowTypes属性的setter和getter方法
- public String getAllowTypes()
- {
- return allowTypes;
- }
- public void setAllowTypes(String allowTypes)
- {
- this.allowTypes = allowTypes;
- }
(3)利用Struts 2的输入校验来判断用户输入的文件是否符合要求。如果不符合要求,接下来就将错误提示添加到FieldError中。该Action中增加的validate()方法代码如下:
程序清单:codes\04\4.3\codeFilter\WEB-INF\src\org\crazyit\app\action\UploadAction.java
- //执行输入校验
- public void validate()
- {
- //将允许上传文件类型的字符串以英文逗号(,)
- //分解成字符串数组从而判断当前文件类型是否允许上传
- String filterResult = filterType(getAllowTypes().split(","));
- //如果当前文件类型不允许上传
- if (filterResult != null)
- {
- //添加FieldError
- addFieldError("upload" , "您要上传的文件类型不正确!");
- }
- }
上面的validate()方法的代码非常简单,它调用了filterTypes来判断浏览者所上传的文件是否符合要求,如果不是允许上传的文件类型,validate()方法就添加了FieldError,这样Struts 2将自动返回input逻辑视图名;只有当该文件的类型是允许上传的文件类型时,才真正执行文件上传逻辑。
为了让文件类型检验失败时能返回input逻辑视图,必须为该Action增加input逻辑视图配置。经过上面的配置,当浏览者上传文件类型为不允许类型时,系统将退回input逻辑视图对应的页面。
修改后的struts.xml文件代码如下。
程序清单:codes\04\4.3\codeFilter\WEB-INF\src\struts.xml
- <!-- 配置处理文件上传的Action -->
- <action name="uploadPro" class="org.crazyit.app.action.UploadAction">
- <!-- 动态设置Action的属性值 -->
- <param name="savePath">/uploadFiles</param>
- <!-- 设置允许上传的文件类型 -->
- <param name="allowTypes">image/png,image/gif,image/jpeg</param>
- <result name="input">/WEB-INF/content/upload.jsp</result>
- <!-- 配置Struts 2默认的视图页面 -->
- <result>/WEB-INF/content/succ.jsp</result>
- </action>
为了在input.jsp页面上显示文件过滤失败的错误提示,可以在该页面中使用如下代码输出错误提示。
- <s:fielderror/>
实现文件大小过滤,与实现文件类型过滤的方法基本相似。虽然在上面的Action类中并没有方法直接获取上传文件的大小,但Action中包含了一个类型为File的属性,该属性封装了文件域对应的文件内容;而File类有一个length()方法,该方法可以返回文件的大小,通过比较该文件的大小和允许上传的文件大小,从而决定是否允许上传该文件。
提示:如果需要实现文件大小的过滤,则可以调用File类的length()方法来获取上传文件的大小,与允许上传的文件大小进行比较,从而决定是否允许上传。
]
本文转自fkJava李刚 51CTO博客,原文链接: http://blog.51cto.com/javaligang/889839 ,如需转载请自行联系原作者