使用Struts2控制文件上传

1.在Struts2的struts.properties文件中,有如下配置,主要用于Struts2上传文件时的上传解析器

#指定使用COS的文件上传解析器

#struts.multipart.parser=cos

#指定使用Pell的文件上传解析器

#struts.multipart.parser=pell

#struts2默认使用Jakarta的Common-FileUpload的文件上传解析器

struts.multipart.parser=jakarta

需要commons-io-1.3.2.jar、commons-fileupload-1.2.1.jar

 

2.实现文件上传的Action

<form action="upload.action" method="post" enctype="multipart/form-data">

      文件标题:<input type="text" name="title" /><br>

      选择文件:<input type="file" name="upload" /><br>

      <input value="上传" type="submit" />

</form>

Struts2框架负责解析HttpServletRequest请求中的参数,包括文件域,Struts2使用File类型来封装文件域

public class UploadAction extends ActionSupport{

      //封装文件标题请求参数的属性

      private String title;

      //封装上传文件域的属性

      private File upload;

      //封装上传文件类型的属性

      private String uploadContentType;

      //封装上传文件名的属性

      private String uploadFileName;

      //直接在struts.xml文件中配置的属性

      private String savePath();

      //getter,setter方法,ServletActionContext.getRequest().getRealPath(savePath);

      public String execute() throws Exception{

             //以服务器的文件保存地址和原文件名建立上传文件输出流

             FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());

             FileInputStream fis = new FileInputStream(getUpload());

             byte[] buffer = new byte[1024];

             int len = 0;

             while((len = fis.read[buffer]) > 0){

                    fos.write(buffer,0,len);

             }

              return SUCCESS;

      }

}

类型为File的xxx属性封装了该文件域对应的文件内容

类型为String的xxxFileName属性封装了该文件域对应的文件的文件名

类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型

 

3.配置文件

struts.xml文件中

<action name="upload" class="UploadAction">

       <param name="savePath">/upload</param>

       <result>/succ.jsp</result>

</action>

web.xml

<!-- 配置Struts2的CleanUp的Filter -->

<filter>

       <filter-name>struts-cleanup</filter-name>

       <filter-class>org.apache.Struts2.dispatcher.ActionContextCleanUp</filter-class>

</filter>

<filter-mapping>

       <filter-name>struts-cleanup</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

 

4.手动实现文件过滤

UploadAction.java

//定义该Action允许上传的文件类型

private String allowTypes;

//getter,setter方法

//过滤文件类型

public String filterType(String[] type){

     //获取希望上传的文件类型

     String fileType = getUploadContentType();

     for(String type : types){

            if(type.equals(fileType)){

                  return null;

            }

     }

     return INPUT;

}

public String execute() throws Exception{

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

     //从而判断当前文件类型是否允许上传

     String filterResult = filterType(getAllowTypes().split(","));

     //如果当前文件类型不允许上传

     if(filterResult != null){

           ActionContext.getContext().put("typeError","文件类型不对");

           return filterResult;

     }  

     //以服务器的文件保存地址和原文件名建立上传文件输出流

     FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());

     FileInputStream fis = new FileInputStream(getUpload());

     byte[] buffer = new byte[1024];

     int len = 0;

     while((len = fis.read[buffer]) > 0){

             fos.write(buffer,0,len);

     }

     return SUCCESS;

}

 

5.拦截器实现文件过滤

Struts2提供了一个文件上传的拦截器,通过配置该拦截器可以更轻松地实现文件过滤。Struts2中文件上传的拦截器是fileUpload。

struts.xml文件中

<action name="upload" class="UploadAction">

       <!-- 配置fileUpload的拦截器 -->

       <interceptor-ref name="fileUpload">

               <!-- 配置允许上传的文件类型 -->

               <param name="allowedType">image/gif,image/jpeg</param>

               <!-- 配置允许上传的文件大小 -->

               <param name="maximumSize">20000</param>

       </interceptor-ref>

       <interceptor-ref name="defaultStack"/>

       <param name="savePath">/upload</param>

       <result name="input">/input.jsp</result>

       <result>/succ.jsp</result>

</action>

 

struts.multipart.saveDir属性

struts.multipart.maxSize属性

你可能感兴趣的:(struts2)