java文件上传过滤,struts2中文件上传过滤

手动实现文件过滤

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

从上面的Action中可以看出,Action内有两个方法分别用于获取文件类型和文件大小,为了实现文件过滤,完全可以通过判断这两个方法的返回值来实现文件过滤。 为了让上面的Action增加文件过滤的功能,在上面的Action中增加如下的方法:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 过滤文件类型

d18c02628675d0a2c816449d98bda930.png     *@paramtypes 系统所有允许上传的文件类型

d18c02628675d0a2c816449d98bda930.png     *@return如果上传文件的文件类型允许上传,返回null,否则返回input字符串

8f1ba5b45633e9678d1db480c16cae3f.png*/4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicString filterType(String[] types)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//取得上传文件的文件类型。d18c02628675d0a2c816449d98bda930.pngString fileType=getUploadContentType();

d18c02628675d0a2c816449d98bda930.png//遍历97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(String type : types)9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(type.equals(fileType))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnnull;

ecedf933ec37d714bd4c2545da43add2.png            }ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.pngreturnINPUT;

8f1ba5b45633e9678d1db480c16cae3f.png    }

运行图:

strlo123.gif

strlo1234.gif

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

4f1150b881333f12a311ae9ef34da474.png//定义该Action允许上传的文件类型4f1150b881333f12a311ae9ef34da474.pngprivateString allowTypes;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png//allowTypes属性的setter和getter方法1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicString getAllowTypes()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnallowTypes;

8f1ba5b45633e9678d1db480c16cae3f.png    }4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicvoidsetAllowTypes(String allowTypes)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngthis.allowTypes=allowTypes;

8f1ba5b45633e9678d1db480c16cae3f.png    }4f1150b881333f12a311ae9ef34da474.png

下面就可以在是实现该Action的execute方法了,在通过该方法实现文件上传之前,应该先判断上传文件的文件类型是否允许上传,增加类型判断后的execute方法如下:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicString execute()throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//将允许上传文件类型的字符串以英文逗号(,)分解成字符串数组。

d18c02628675d0a2c816449d98bda930.png//从而判断当前文件类型是否允许上传d18c02628675d0a2c816449d98bda930.pngString filterResult=filterType(getAllowTypes().split(","));

d18c02628675d0a2c816449d98bda930.png//如果当前文件类型不允许上传97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(filterResult!=null)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            ActionContext.getContext().put("typeError","您要上传的文件类型不正确!");

d18c02628675d0a2c816449d98bda930.pngreturnfilterResult;

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//以服务器的文件保存地址和原文件名建立上传文件输出流d18c02628675d0a2c816449d98bda930.pngFileOutputStream fos=newFileOutputStream(getSavePath()+"\\"d18c02628675d0a2c816449d98bda930.png+getUploadFileName());

d18c02628675d0a2c816449d98bda930.png//以上传文件建立一个文件上传流d18c02628675d0a2c816449d98bda930.pngFileInputStream fis=newFileInputStream(getUpload());

d18c02628675d0a2c816449d98bda930.png//将上传文件的内容写入服务器d18c02628675d0a2c816449d98bda930.pngbyte[] buffer=newbyte[1024];

d18c02628675d0a2c816449d98bda930.pngintlen=0;

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifwhile((len=fis.read(buffer))>0)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            fos.write(buffer,0, len);

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.pngreturnSUCCESS;

8f1ba5b45633e9678d1db480c16cae3f.png    }

上面的Action类代码非常简单,它包含的execute方法先判断当前文件类型是否是允许上传的文件类型,如果该文件类型不允许上传,则返回input逻辑视图名;只有当该文件的类型是允许上传的文件类型时,才真正执行文件上传逻辑。

为了让文件类型检验失败时能返回input逻辑视图,因此必须为该Action增加input逻辑视图配置,

下面是该Action的配置文件代码。

4f1150b881333f12a311ae9ef34da474.png<?xml  version="1.0" encoding="UTF-8"?>4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.pngstruts PUBLIC

4f1150b881333f12a311ae9ef34da474.png    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

4f1150b881333f12a311ae9ef34da474.png    "http://struts.apache.org/dtds/struts-2.0.dtd">4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.pngimage/bmp,image/png,image/gif,image/jpeg4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png/upload4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png/succ.jsp4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png/upload.jsp4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png

通过上面的配置看出,上面文件类型仅能上传各种类型的图片文件,如果试图上传其他类型的文件,系统将转入input逻辑视图,该逻辑视图就是upload.jsp页面,该页面中使用如下代码输出错误提示:

4f1150b881333f12a311ae9ef34da474.png${requestScope.typeError}

如果试图上传非图片类型的文件,可以看到出错提示,提示用户不要上传非图片类型的文件

通过上面的介绍,我们可以更轻易地完成了文件类型的过滤。

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

拦截器实现文件过滤

上面手动实现文件过滤的方式虽然简单,但毕竟需要书写大量的过滤代码,不利于程序的高层次解构,而且开发复杂。

Struts2提供了一个文件上传的拦截器,通过配置该拦截器可以更轻松的实现文件过滤。Struts2中文件上传的过滤器是fileUpload,为了让该拦截器起作用,只需要在该Action配置该拦截器引用即可。

配置fileUpload拦截器时,可以为其指定两个参数:

allowedTypes:该参数指定允许上传的文件类型,多个文件类型之间以英文逗号(,)隔开。

maximumSize:该参数指定允许上传的文件大小,单位是字节。

通过配置fileUpload的拦截器,可以更轻易的实现文件过滤,当文件过滤失败后,系统自动转入input逻辑视图,因此必须为该Action配置名为input的逻辑视图。除此之外,还必须显式地为该Action配置defaultStack的拦截器引用。

通过拦截器来实现文件过滤的配置文件如下:

4f1150b881333f12a311ae9ef34da474.png<?xml  version="1.0" encoding="UTF-8"?>4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.pngstruts PUBLIC

4f1150b881333f12a311ae9ef34da474.png    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

4f1150b881333f12a311ae9ef34da474.png    "http://struts.apache.org/dtds/struts-2.0.dtd">4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.pngimage/bmp,image/png,image/gif,image/jpeg4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png20004f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png/upload4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png/succ.jsp4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png/upload.jsp4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png4f1150b881333f12a311ae9ef34da474.png

上面的拦截器过滤不仅过滤了文件的类型,也过滤了文件大小。上传文件的类型只能是图片文件,且文件大小不能大于2000字节(当然,我们随时可以更改到更大)。如果我们上传文件的文件太大,系统将转入input的逻辑视图,也就是/upload.jsp页面。

posted on 2009-05-15 09:14 L.J. 阅读(2202) 评论(1)  编辑  收藏 所属分类: Struts2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值