手动实现文件过滤

简介:

大部分时候,Web应用不允许浏览者自由上传,尤其不能允许上传可执行性文件——因为可能是病毒程序。通常,我们可以允许浏览者上传图片、上传压缩文件等;除此之外,还必须对浏览者上传的文件大小进行限制。因此必须在文件上传中进行文件过滤。

从上面的Action中可以看出,Action内有两个方法分别用于获取文件类型和文件大小。为了实现文件过滤,完全可以通过判断这两个方法的返回值来实现文件过滤。在这种方式下,程序员获取全部的过滤控制权利。

如果需要手动实现文件过滤,可按如下步骤进行。

 Action中定义一个专用于进行文件过滤的方法,该方法的方法名字是任意的,该方法的逻辑就是判断上传文件的类型是否为允许类型。例如增加filterTypes()方法,方法代码如下。

程序清单:codes\04\4.3\codeFilter\WEB-INF\src\org\crazyit\app\action\UploadAction.java

 
  1. /**  
  2.  * 过滤文件类型  
  3.  * @param types 系统所有允许上传的文件类型  
  4.  * @return 如果上传文件的文件类型允许上传,  
  5.  *         返回null,否则返回error字符串  
  6.  */ 
  7. public String filterTypes(String[] types)  
  8. {  
  9.     //获取希望上传的文件类型  
  10.     String fileType = getUploadContentType();  
  11.     for (String type : types)  
  12.     {  
  13.         if (type.equals(fileType))  
  14.         {  
  15.             return null;  
  16.         }  
  17.     }  
  18.     return ERROR;  
  19. }  

 上面的方法判断了上传文件的文件类型是否在允许上传文件类型列表中。为了让应用程序可以动态配置允许上传的文件列表,为该Action增加了一个allowTypes属性,该属性的值列出了所有允许上传的文件类型。为了可以在struts.xml文件中配置allowTypes属性的值,必须在Action类中提供如下代码。

程序清单:codes\04\4.3\codeFilter\WEB-INF\src\org\crazyit\app\action\UploadAction.java

 
  1. //定义该Action允许上传的文件类型  
  2. private String allowTypes;  
  3. //allowTypes属性的setter和getter方法  
  4. public String getAllowTypes()  
  5. {  
  6.     return allowTypes;  
  7. }  
  8. public void setAllowTypes(String allowTypes)  
  9. {  
  10.     this.allowTypes = allowTypes;  
  11. }  

3)利用Struts 2的输入校验来判断用户输入的文件是否符合要求。如果不符合要求,接下来就将错误提示添加到FieldError中。该Action中增加的validate()方法代码如下:

程序清单:codes\04\4.3\codeFilter\WEB-INF\src\org\crazyit\app\action\UploadAction.java

 
  1. //执行输入校验  
  2. public void validate()  
  3. {  
  4.     //将允许上传文件类型的字符串以英文逗号(,)  
  5.     //分解成字符串数组从而判断当前文件类型是否允许上传  
  6.     String filterResult = filterType(getAllowTypes().split(","));  
  7.     //如果当前文件类型不允许上传  
  8.     if (filterResult != null)  
  9.     {  
  10.         //添加FieldError  
  11.         addFieldError("upload" , "您要上传的文件类型不正确!");  
  12.     }  
  13. }  

上面的validate()方法的代码非常简单,它调用了filterTypes来判断浏览者所上传的文件是否符合要求,如果不是允许上传的文件类型,validate()方法就添加了FieldError,这样Struts 2将自动返回input逻辑视图名;只有当该文件的类型是允许上传的文件类型时,才真正执行文件上传逻辑。

为了让文件类型检验失败时能返回input逻辑视图,必须为该Action增加input逻辑视图配置。经过上面的配置,当浏览者上传文件类型为不允许类型时,系统将退回input逻辑视图对应的页面。

修改后的struts.xml文件代码如下。

程序清单:codes\04\4.3\codeFilter\WEB-INF\src\struts.xml

 
  1. <!-- 配置处理文件上传的Action -->  
  2. <action name="uploadPro" class="org.crazyit.app.action.UploadAction">  
  3.     <!-- 动态设置Action的属性值 -->  
  4.     <param name="savePath">/uploadFiles</param>  
  5.     <!-- 设置允许上传的文件类型 -->  
  6.     <param name="allowTypes">image/png,image/gif,image/jpeg</param>  
  7.     <result name="input">/WEB-INF/content/upload.jsp</result>     
  8.     <!-- 配置Struts 2默认的视图页面 -->  
  9.     <result>/WEB-INF/content/succ.jsp</result>    
  10. </action>  

为了input.jsp页面上显示文件过滤失败的错误提示,可以在该页面中使用如下代码输出错误提示。

 
  1. <s:fielderror/> 

实现文件大小过滤,与实现文件类型过滤的方法基本相似。虽然在上面的Action类中并没有方法直接获取上传文件的大小,但Action中包含了一个类型为File的属性,该属性封装了文件域对应的文件内容;而File类有一个length()方法,该方法可以返回文件的大小,通过比较该文件的大小和允许上传的文件大小,从而决定是否允许上传该文件。

提示:如果需要实现文件大小的过滤,则可以调用File类的length()方法来获取上传文件的大小,与允许上传的文件大小进行比较,从而决定是否允许上传。


]


 

本文转自fkJava李刚 51CTO博客,原文链接: http://blog.51cto.com/javaligang/889839 ,如需转载请自行联系原作者


 

相关文章
|
监控 API 数据安全/隐私保护
屏幕监控软件开发指南:C++实现原理解析
在当今数字化时代,屏幕监控软件成为了企业管理和个人隐私保护的重要工具。本文将深入探讨如何使用C++语言实现屏幕监控软件,并解析其实现原理。我们将通过多个代码示例来说明其工作方式,最后将介绍如何将监控到的数据自动提交到网站。
453 3
|
数据可视化 BI C#
C#程序采用AOT发布,真的可以避免被反编译?
C#程序采用AOT发布,真的可以避免被反编译?
1743 0
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
253 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
650 220
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
886 61
|
9天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1461 157