Struts2权威指南总结6:文件的上传和下载

1,将表单元素设置enctype=”multipart/form-data”,则提交表单不再以字符串的形式提交,而是以二进制的形式提交,此时通过HttpServletRequest的getParameter方法无法正常获取到值,我们可以通过二进制流来获取请求内容。从而实现文件的上传。

2,Java领域有两个常用的文件上传项目,Common-FileUpload和COS。Struts2在原有的文件上传项目的基础上,进行了进一步封装,简化了文件上传。

3,struts2提供了用于下载的stream结果类型。

4,文件上传的原理:

(1)表单元素的enctype属性

这个属性指定的是表单数据的编码方式。该属性有如下三个值:


5,以默认的方式提交file域,上传的数据显示出来是”%CC%E2%A3%DD%EE”的格式,通过URLEncoder和URLDecoder两个类可以完成上述格式和中文之间的转换。


6,每个表单域的内容总是以-------------------------------7d7da193e0432样式的字符串开始,后面的字符串可能变化,但前面的中划线总是不变的。对于每个文件域而言,在第二行内容中总会包含filename=””的字符串。

以二进制流的形式遍历表单,如果内容以----------------------------开头,以—结尾表明已到请求内容尾。如果以---------------------------开始,表名开始了一个表单域,如果下一行中有filename,表名是一个文件域,需要跳过两行,处理文件内容。

 

7,使用框架上传文件

任何上传框架都负责解析出request请求中所有的域,Java领域有两个常用的文件上传项目,Common-FileUpload和COS。

 

8,struts2的文件上传

在struts2的struts.properties文件中,有如下配置,他们用于配制struts2上传文件时的上传解析器。


9,struts2默认使用的是Jakatra的common-FileUpload文件上传框架。因此,如果需要使用struts2的文件上传功能,则需要在Web应用中增加两个Jar文件,即common-io-1.3.1.jar和common-fileupload-1.2.jar。

10,struts2默认使用common-FileUpload是因为他们都是apache下的项目。我们也可以使用其他的上传框架,我们只需要修改struts.properties中的struts.multipart.parser常量,并在lib中添加必要的jar包即可。

11,struts2实现文件上传的三个关键属性:



12,在上传文件的web.xml配置文件中,除了要配置struts2的核心控制器,还需要配置一个Filter,叫做ActionContextCleanUp的类。


这个配置的作用是方便struts2与sitemesh的整合。与文件上传没有太大的关系。此处加载这个filter的原因是:在开发struts2的文件上传引用过程中,发现有的时候会出现一些未知的异常,但加入了这个filter之后,一起恢复正常。

在文件上传应用中加载ActionContextCleanUp的配置不会引起任何异常,因为该类本来就是FilterDispatcher的辅助类。

 

13,手动实现文件过滤。

即只允许用户上传指定类型的文件。

在Action类中提供一个方法:

//用于判断是否支持上传的类型

public String filterType(String[]types){

    //获取上传文件的类型

    StringfileTypes = getUploadContentType();

    //遍历

    for(Stringtype : types){

       if(type.equals(fileType)){

           returnnull;

       }

    }

    return“input”;

}

提供一个allowTypes属性,提供getter和setter方法。用于接收指定的参数。

在execute方法中通过getAllowTypes()方法获取允许的类型,在通过filterType方法判断是否支持这个类型,如果返回是null,说明支持,允许上传,否则不允许上传,直接return。

 

14,拦截器实现文件过滤

Struts2提供了一个文件上传的拦截器,通过配置这个拦截器就可以轻松实现文件的过滤。Struts2中文件上传的过滤器是fileUpload,只需在<action>中配置该拦截器的引用即可。



当文件过滤失败后,系统将自动转入input视图处理。此外,还必须显示的为该Action配置defaultStack拦截器引用。

 

15,上传文件的常见配置

每次上传时,可以看到如下信息:


第一个是找不到临时文件夹saveDir的配置,

第二个是系统正在删除一个临时文件的配置,在上传过程中产生的临时文件。

 

16,同时上传多个文件

可以通过数组和list集合实现多个文件上传。

数组方式:

提供三个数组分别封装文件名,文件类型,文件名。

Private File[] upload;

Private String[] uploadContentType;

Private String[] uploadFileName;

Setter and getter;

在execute方法中迭代upload数组,写入到服务器即可。

 

List方式:只需要使用list集合来封装以上三个属性即可。

Private List<File> upload;

Private List<String>uploadContentType;

Private List<String>uploadFileName;

Setter and getter;

在execute中迭代List写入到服务器即可。

 

17,文件下载

通过struts2的stream结果集搞定。指定stream类型时,需要指定一个inputName参数,该参数指定了一个输入流,这个输入流是下载文件的入口。

在Action类中需要提供一个InputStream。可以提供一个getInputStream方法,struts2就会自动根据这个方法的流来生成下载流。

从StreamResult类中的源码可以看出,默认的返回需要一个InputStream,所以struts2可以自动根据getInputStream方法获取下载流。

配置4个参数:

contentType,文件类型

contentDisposition,打开文件方式

inputName,配置下载流名称

bufferSize,设置缓冲区大小。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值