struts2控制文件上传和下载

来源:互联网 发布:淘宝厂家直销违规吗 编辑:程序博客网 时间:2024/05/01 23:34

为了能上传文件,我们必须将表单的method设置为post,同时将enctype设置为mutipart/form-data。在struts2的struts2.properties文件中,我们可以看到struts2使用了Common-FileUpload,Cos,Pell等组件构成上传的处理框架。

特别注意!在你写的Action中,三个参数的名字必须符合:

File文件:xxx

String 类型的FileName:xxxFileName

String类型的ContentType:xxxContentType

xxx必须一致!!

懒得手打了。转载链接:http://www.cnblogs.com/WJ-163/p/5946007.html

单文件上传

一、要实现文件上传,需在项目中添加两个jar文件

二、上传准备的页面

注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post

复制代码
 <h2>单个文件上传</h2>    <s:form action="upload.action" enctype="multipart/form-data" method="post">    <s:textfield name="title" label="标题"/>    <s:file name="upload" label="选择文件"/><br/>    <s:submit name="submit" value="上传文件"></s:submit>        </s:form>
复制代码

实现文件上传的Action类

复制代码
public class UploadAction extends ActionSupport{    //封装上传文件属性    private File upload;    //封装上传文件的类型    private String uploadContentType;    //封装上传文件名称    private String uploadFileName;    //获取文件上传的路径    private String savePath;        @Override    public String execute() throws Exception {        byte[] buffer=new byte[1024];                //读取文件        FileInputStream fis=new FileInputStream(getUpload());        //保存文件        FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName());        int length=fis.read(buffer);        while(length>0){            //每次写入length长度的内容            fos.write(buffer,0,length);            length=fis.read(buffer);        }        fis.close();        fos.flush();        fos.close();                return SUCCESS;    }

      //获取文件上传的保存路径 通过读取存放目录获得保存路径
       public String getSavePath() {
          return ServletActionContext.getServletContext().getRealPath(savePath);
     }

 
复制代码

在Action中使用了三个属性封装文件信息:

File类型的XXX属性,与表单的File控件的name属性一样,用于封装File控件对应的文件内容

String类型的xxxFileName属性,该属性名称由前面的File类型属性和FileName组合,是固定的语法,是封装File控件对应文件的文件名

String类型的XXXContentType属性,同样由xxx属性和ContentType组合而成,是固定语法,封装File控件对应文件的文件类型

配置Action:

复制代码
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>   <constant name="struts.devMode" value="true"></constant>    <package name="default" namespace="/" extends="struts-default">    <!-- 文件上传 -->        <action name="upload" class="cn.happy.action.UploadAction">        <!-- 通过param参数设置保存目录的路径 -->        <param name="savePath">/upload</param>           <result name="success">ok.jsp</result>         </action>            </package></struts>
复制代码

上传成功后的结果页面:植入的value是Action类中所对应的实体类属性

 您所上传的文件是:<s:property value="uploadFileName"/><br/> 文件类型:<s:property value="uploadContentType"/>

实现效果:



多文件上传

与单文件上传的不同之处在于 将三个属性的类型修改成数组类型,并通过for循环进行遍历

复制代码
public class SomeUploadAction extends ActionSupport {    // 封装上传文件属性    private File[] upload;    // 封装上传文件的类型    private String[] uploadContentType;    // 封装上传文件名称    private String[] uploadFileName;    // 封装文件上传的路径    private String savePath;    public String execute() throws Exception {        byte[] buffer = new byte[1024];        for (int i = 0; i < upload.length; i++) {            FileInputStream fis = new FileInputStream(getUpload()[i]);            FileOutputStream fos = new FileOutputStream(getSavePath() + "\\"                    + this.getUploadFileName()[i]);            int length = fis.read(buffer);            while (length > 0) {                fos.write(buffer, 0, length);                length = fis.read(buffer);            }            fos.flush();            fos.close();            fis.close();        }        return SUCCESS;    }

      public String getSavePath() {
         return ServletActionContext.getServletContext().getRealPath(savePath);
       }

 
复制代码

实现效果:


 

 实现文件下载

为了支持文件的下载,Struts2框架提供了stream结果类型,该类型的作用就是专门用于实现文件下载的功能

 

实现文件下载:

 由于在Struts2中实现文件下载时需要用到InputStream,所以在文件下载Action中要提供一个获得InputStream的方法,通过这个输入流将可以获取希望下载的文件内容

复制代码
public class DownAction extends ActionSupport{    //读取下载文件的目录    private String inputPath;    //下载文件的文件名    private String fileName;    //读取下载文件的输入流    private InputStream inputStream;    //下载文件的类型    private String conetntType;        @Override    public String execute() throws Exception {                return SUCCESS;    }        //创建InputStream输入流    public InputStream getInputStream() throws FileNotFoundException {        //String path=ServletActionContext.getServletContext().getRealPath(inputPath);        return new BufferedInputStream(new FileInputStream(inputPath+"\\"+fileName));    }
复制代码

通过Context上下文得到下载文件的实际路径,并构建了一个InputStream输入流实现文件下载读取

Action配置:

复制代码
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>   <constant name="struts.devMode" value="true"></constant>    <package name="default" namespace="/" extends="struts-default">           <!-- 文件下载 -->                 <action name="down" class="cn.happy.action.DownAction">        <param name="inputPath">/image</param>           <result name="success" type="stream">           <param name="contentType">application/octet-stream</param>           <param name="inputName">inputStream</param>           <param name="contentDisposition">attachment;filename="${fileName}"</param>           <param name="bufferSize">4096</param>           </result>         </action>    </package></struts>
复制代码

在配置文件中,inputPath的param标签标示你要下载的文件的位置;

contentType参数决定了下载文件的类型。不同文件类型对应的参数值也是不同的。

inputName标示指定被下载文件的入口输入流,这和我们前面写的DownAction类的getInputStream()对应.

通常情况下,contentType参数直接设置为application/octet-stream即可

contentDispoistion参数由两个部分组成,前面的部分表示处理文件的形式,如attachement表示在下载时弹出对话框,提示用户保存或者直接打开文件,而后一部分表示下载文件的名称,两部分之间以“;”进行分隔

当单击超链接时,即可下载.下面的超链接中,down.action标示实现下载的action是down,?后面的名字标示我们下载的文件是1.png.

 

文件上传过滤!

分为两种方式吧,一种手动方式实现过滤,一种配置struts.xml

先来看看各种文件类型:

查看文本打印
  1. '.a'      : 'application/octet-stream',      
  2.   
  3. '.ai'     : 'application/postscript',      
  4.   
  5. '.aif'    : 'audio/x-aiff',      
  6.   
  7. '.aifc'   : 'audio/x-aiff',      
  8.   
  9. '.aiff'   : 'audio/x-aiff',      
  10.   
  11. '.au'     : 'audio/basic',      
  12.   
  13. '.avi'    : 'video/x-msvideo',      
  14.   
  15. '.bat'    : 'text/plain',      
  16.   
  17. '.bcpio' : 'application/x-bcpio',      
  18.   
  19. '.bin'    : 'application/octet-stream',      
  20.   
  21. '.bmp'    : 'image/x-ms-bmp',      
  22.   
  23. '.c'      : 'text/plain',     
  24.   
  25. '.cdf'    : 'application/x-cdf',      
  26.   
  27. '.cdf'    : 'application/x-netcdf',      
  28.   
  29. '.cpio'   : 'application/x-cpio',      
  30.   
  31. '.csh'    : 'application/x-csh',      
  32.   
  33. '.css'    : 'text/css',      
  34.   
  35. '.dll'    : 'application/octet-stream',      
  36.   
  37. '.doc'    : 'application/msword',      
  38.   
  39. '.dot'    : 'application/msword',      
  40.   
  41. '.dvi'    : 'application/x-dvi',      
  42.   
  43. '.eml'    : 'message/rfc822',      
  44.   
  45. '.eps'    : 'application/postscript',      
  46.   
  47. '.etx'    : 'text/x-setext',      
  48.   
  49. '.exe'    : 'application/octet-stream',      
  50.   
  51. '.gif'    : 'image/gif',      
  52.   
  53. '.gtar'   : 'application/x-gtar',      
  54.   
  55. '.h'      : 'text/plain',      
  56.   
  57. '.hdf'    : 'application/x-hdf',      
  58.   
  59. '.htm'    : 'text/html',      
  60.   
  61. '.html'   : 'text/html',      
  62.   
  63. '.ief'    : 'image/ief',      
  64.   
  65. '.jpe'    : 'image/jpeg',      
  66.   
  67. '.jpeg'   : 'image/jpeg',      
  68.   
  69. '.jpg'    : 'image/jpeg',      
  70.   
  71. '.js'     : 'application/x-javascript',      
  72.   
  73. '.ksh'    : 'text/plain',      
  74.   
  75. '.latex' : 'application/x-latex',      
  76.   
  77. '.m1v'    : 'video/mpeg',      
  78.   
  79. '.man'    : 'application/x-troff-man',      
  80.   
  81. '.me'     : 'application/x-troff-me',      
  82.   
  83. '.mht'    : 'message/rfc822',      
  84.   
  85. '.mhtml' : 'message/rfc822',      
  86.   
  87. '.mif'    : 'application/x-mif',      
  88.   
  89. '.mov'    : 'video/quicktime',      
  90.   
  91. '.movie' : 'video/x-sgi-movie',      
  92.   
  93. '.mp2'    : 'audio/mpeg',      
  94.   
  95. '.mp3'    : 'audio/mpeg',      
  96.   
  97. '.mpa'    : 'video/mpeg',      
  98.   
  99. '.mpe'    : 'video/mpeg',      
  100.   
  101. '.mpeg'   : 'video/mpeg',      
  102.   
  103. '.mpg'    : 'video/mpeg',      
  104.   
  105. '.ms'     : 'application/x-troff-ms',      
  106.   
  107. '.nc'     : 'application/x-netcdf',      
  108.   
  109. '.nws'    : 'message/rfc822',      
  110.   
  111. '.o'      : 'application/octet-stream',      
  112.   
  113. '.obj'    : 'application/octet-stream',      
  114.   
  115. '.oda'    : 'application/oda',      
  116.   
  117. '.p12'    : 'application/x-pkcs12',      
  118.   
  119. '.p7c'    : 'application/pkcs7-mime',      
  120.   
  121. '.pbm'    : 'image/x-portable-bitmap',      
  122.   
  123. '.pdf'    : 'application/pdf',      
  124.   
  125. '.pfx'    : 'application/x-pkcs12',      
  126.   
  127. '.pgm'    : 'image/x-portable-graymap',      
  128.   
  129. '.pl'     : 'text/plain',      
  130.   
  131. '.png'    : 'image/png',      
  132.   
  133. '.pnm'    : 'image/x-portable-anymap',      
  134.   
  135. '.pot'    : 'application/vnd.ms-powerpoint',      
  136.   
  137. '.ppa'    : 'application/vnd.ms-powerpoint',      
  138.   
  139. '.ppm'    : 'image/x-portable-pixmap',      
  140.   
  141. '.pps'    : 'application/vnd.ms-powerpoint',      
  142.   
  143. '.ppt'    : 'application/vnd.ms-powerpoint',      
  144.   
  145. '.ps'     : 'application/postscript',      
  146.   
  147. '.pwz'    : 'application/vnd.ms-powerpoint',      
  148.   
  149. '.py'     : 'text/x-python',      
  150.   
  151. '.pyc'    : 'application/x-python-code',      
  152.   
  153. '.pyo'    : 'application/x-python-code',      
  154.   
  155. '.qt'     : 'video/quicktime',      
  156.   
  157. '.ra'     : 'audio/x-pn-realaudio',      
  158.   
  159. '.ram'    : 'application/x-pn-realaudio',      
  160.   
  161. '.ras'    : 'image/x-cmu-raster',      
  162.   
  163. '.rdf'    : 'application/xml',      
  164.   
  165. '.rgb'    : 'image/x-rgb',      
  166.   
  167. '.roff'   : 'application/x-troff',      
  168.   
  169. '.rtx'    : 'text/richtext',      
  170.   
  171. '.sgm'    : 'text/x-sgml',      
  172.   
  173. '.sgml'   : 'text/x-sgml',      
  174.   
  175. '.sh'     : 'application/x-sh',      
  176.   
  177. '.shar'   : 'application/x-shar',      
  178.   
  179. '.snd'    : 'audio/basic',      
  180.   
  181. '.so'     : 'application/octet-stream',      
  182.   
  183. '.src'    : 'application/x-wais-source',      
  184.   
  185. '.sv4cpio''application/x-sv4cpio',      
  186.   
  187. '.sv4crc' : 'application/x-sv4crc',      
  188.   
  189. '.swf'    : 'application/x-shockwave-flash',      
  190.   
  191. '.t'      : 'application/x-troff',      
  192.   
  193. '.tar'    : 'application/x-tar',      
  194.   
  195. '.tcl'    : 'application/x-tcl',      
  196.   
  197. '.tex'    : 'application/x-tex',      
  198.   
  199. '.texi'   : 'application/x-texinfo',      
  200.   
  201. '.texinfo''application/x-texinfo',      
  202.   
  203. '.tif'    : 'image/tiff',      
  204.   
  205. '.tiff'   : 'image/tiff',      
  206.   
  207. '.tr'     : 'application/x-troff',      
  208.   
  209. '.tsv'    : 'text/tab-separated-values',      
  210.   
  211. '.txt'    : 'text/plain',      
  212.   
  213. '.ustar' : 'application/x-ustar',      
  214.   
  215. '.vcf'    : 'text/x-vcard',      
  216.   
  217. '.wav'    : 'audio/x-wav',      
  218.   
  219. '.wiz'    : 'application/msword',      
  220.   
  221. '.wsdl'   : 'application/xml',      
  222.   
  223. '.xbm'    : 'image/x-xbitmap',      
  224.   
  225. '.xlb'    : 'application/vnd.ms-excel',      
  226.   
  227. '.xls'    : 'application/excel',      
  228.   
  229. '.xls'    : 'application/vnd.ms-excel',      
  230.   
  231. '.xml'    : 'text/xml',      
  232.   
  233. '.xpdl'   : 'application/xml',      
  234.   
  235. '.xpm'    : 'image/x-xpixmap',      
  236.   
  237. '.xsl'    : 'application/xml',      
  238.   
  239. '.xwd'    : 'image/x-xwindowdump',      
  240.   
  241. '.zip'    : 'application/zip',  

手动实现文件过滤

s1:在对应的UploadAction中定义一个类型过滤方法,这个方法的名字任意,只需要在后面的validate()方法调用即可,方法内容是传入一个类型数组,比较当前的文件类型(xxxContentType)是否与类型数组的某个类型一致,见下表:

public String filterTypes(String[] types){String fileType= getUploadContentType();for(String type:types){System.out.println(type);if(type.equals(fileType)){return null;}}return ERROR;}


s2:在struts.xml文件中配置一个参数,这个参数是允许的文件类型。如下:

<package name="upload" extends="struts-default"><action name="uploadAction" class="cn.nju.fxd.action.UploadAction"><param name="savePath">/upload</param><param name="allowType">image/png,image/gif,image/jpeg</param><result>/uploadSucc.jsp</result><result name="input">/upload.jsp</result></action></package>

s3:在对应的UploadAction中,定义和参数同名的属性,为allowType,增加get和set方法

s4:在UploadAction编写validate()函数,调用前面的filterTypes()函数

public void validate(){//调用fiterTypes函数//allowType分解为数组,因为fiterTypes函数接受的参数是数组String filterResult=filterTypes(getAllowType().split(","));if(filterResult!=null){addFieldError("upload", "Sorry,errorType");}}
s5:运行检验成果,


拦截器实现文件过滤:

Struts2提供了一个文件上传拦截器,通过配置该拦截器可以轻松的实现文件过滤。Struts2中文件上传的拦截器是fileUpload,为了让该拦截器起作用,只需要在该Action中配置该拦截器引用即可。
配置FileUpload的时候,可以为其制定两个参数:
allowTypes:该参数允许上传的文件类型,多个文件类型之间用英文逗号(,)隔开
maximumSize:该参数允许上传的文件大小,单位是字节

下面上一个简单的例子。
<package name="upload" extends="struts-default"><action name="uploadAction" class="cn.nju.fxd.action.UploadAction"><interceptor-ref name="fileUpload"><param name="allowedTypes">image/png,image/gif,image/jpeg</param><param name="maximumSize">2000</param></interceptor-ref><interceptor-ref name="defaultStack"/><param name="savePath">/upload</param><param name="allowType">image/png,image/gif,image/jpeg</param><result>/uploadSucc.jsp</result><result name="input">/upload.jsp</result></action></package>
如果需要使用非默认拦截器,必须显示的配置引用默认拦截器defaultStack,不然会报错!这一点非常重要!



0 0