码迷,mamicode.com
首页 > 其他好文 > 详细

FileUpload 拦截器

时间:2015-04-07 15:18:48      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传
 
步骤:
          1. 在 Jsp 页面的文件上传表单里使用 file 标签. 如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的
          2. 在 Action 中新添加 3 个和文件上传相关的属性. 这 3 个属性的名字必须是以下格式
               private File uploadImage; //上传的文件
               private String uploadImageContentType;  //上传的文件的类型
               private String uploadImageFileName;     //上传文件的名称
 
          uploadImage 是 jsp 页面上的 file 标签的名字.
          上传文件:<input type="file" name="uploadImage">
如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文件的文件名和文件类型
                                          定义方式是分别是jsp页面file组件的名称+ContentType,
 

                                          jsp页面file组件的名称+FileName

 单文件上传代码如下:
 
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这个两个文件已经在Struts2搭建jar中已经加入
第二步:把form表的enctype设置为:“multipart/form-data“,如下:
<form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action" 
          name="form1"  method="post"  enctype="multipart/form-data" >
             上传文件名称:<input type="file" name="uploadImage">
           <input type="submit" value="上传">
</form>
 
第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:
 public class HelloWorldAction{

  private File uploadImage;//得到上传的文件

  private String uploadImageContentType;//得到文件的类型

  private String uploadImageFileName;//得到文件的名称

  //这里略省了属性的getter/setter方法
  public String saveFile() throws Exception{
     String realpath = ServletActionContext.getServletContext().getRealPath("/images");
     File file = new File(realpath);
     if(!file.exists()) file.mkdirs();
     
     FileUtils.copyFile(uploadImage, new File(file, uploadImageFileName));
     return "success";
    }
}
 
第四步:在struts.xml文件中增加如下配置
<package name="upload" namespace="/upload" extends="struts-default" >
          <!-- 单文件上传 -->
        <action name="uploadAction_*" class="cn.upload.UploadAction" method="{1}">
           <result name="success">/upload/success.jsp</result>
  
           <!-- 定义上传出错要转向的页面 -->
           <result name="input">/upload/error.jsp</result>

       </action>
<package>
 
设置上传文件的总开关
在struts.xml文件加载该资源文件
       <!-- 设置comonFileupload上传组件允许的文件大小 才能测试出上传文件过大出现的错误信息
             默认值是2M-->
       <constant name="struts.multipart.maxSize" value="86170804"/>
 
 
 
 

如何实现单文件的上传:
   * 定义jsp页面
      <form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action" 
          name="form1"  method="post"  enctype="multipart/form-data" >
             上传文件名称:<input type="file" name="uploadImage">
           <input type="submit" value="上传">
       </form>
      
   * 定义action
             public class UploadAction extends ActionSupport {
         
               /* 上传的文件先保存到临时目录,保存为临时文件
                 *    E:\\apache-tomcat-6.0.18\\work\\Catalina\localhost\\itcast1021struts2
                 *                            \\upload__2ad2288_13329912deb__8000_00000000.tmp
                 * 当处理完临时文件后,再删除该临时文件
                 * Removing file uploadImage  E:\\apache-tomcat-6.0.18\\work\\Catalina\localhost\\struts2
                 *                            \\upload__2ad2288_13329912deb__8000_00000000.tmp
                 */
               private File uploadImage;
              
               //上传文件的类型,格式:Form表单中文件域的name属性的值+ContentType
               private String uploadImageContentType;
              
               //上传文件的真实名称,格式:Form表单中文件域的name属性的值+FileName
               private String uploadImageFileName;
              
               public String saveFile(){
                    System.out.println("uploadImageContentType  "+uploadImageContentType);
                    System.out.println("uploadImageFileName  "+uploadImageFileName);
                    System.out.println("xxxxxxxxxxxx");
                   
                    //保存临时文件到指定的目录
                    try {
                         ServletContext sc=ServletActionContext.getServletContext();
                         String realpath=sc.getRealPath("/pic");
                         File newFile=new  File(realpath,uploadImageFileName);
                         FileUtils.copyFile(uploadImage, newFile);
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
                   
                    return "success";
               }
            }
    * 创建struts_upload.xml文件,增加如下配置         
          <struts>
                 <package name="upload" namespace="/upload" extends="struts-default">
                     <action name="uploadAction_*" class="cn.upload.UploadAction" method="{1}">
                         
                          <result name="success">/upload/success.jsp</result>
                          <!-- 文件上传失败时,要转向input所指向的路径 -->
                          <result name="input">/upload/error.jsp</result>
                     </action>
                 </package>
               </struts>
              
   * 测试
  
   * 设置上传文件的总开关
       * 在struts_upload.xml文件,增加如下配置
          <!--设置上传文件的总开关,默认值是2M,全局开关,能控制项目中的所有的上传功能,小区物业的总开关-->
          <constant name="struts.multipart.maxSize" value="200097152"></constant>
  
           * 测试
       
   * 设置只对包有效的上传文件的参数,
       * 配置如下,放置在package包中
              <interceptors>
                <!-- 声明新的拦截器栈 -->
                <interceptor-stack name="newFileUploadStack">
                     <!-- 修改默认栈中的上传拦截器的参数 -->
                    <interceptor-ref name="defaultStack">
                         <!--设置上传文件的大小,只对当前的action有效,小区户主家里的开关-->
                         <param name="fileUpload.maximumSize">20097152</param>
                         <!-- 配置允许上传文件的类型,如果有多个类型,中间用","隔开 -->
                         <param name="fileUpload.allowedTypes">application/vnd.ms-powerpoint,application/octet-stream,text/plain</param>
                         <!-- 配置上传文件扩展名,如果有多个类型,中间用","隔开 -->
                          <param name="fileUpload.allowedExtensions">ppt</param>
                    </interceptor-ref>
                </interceptor-stack>
             </interceptors>
      
             <!-- 运行新的拦截器栈 -->
               <default-interceptor-ref name="newFileUploadStack"/>
        
         * 测试
        
   * 设置只对当前的action有效
        *  配置如下,放置到action中              
               <!-- 在action配置上传拦截器的参数,只对当前的action有效 -->
               <interceptor-ref name="defaultStack">
                  <!--设置上传文件的大小,只对当前的action有效,小区户主家里的开关-->
                  <param name="fileUpload.maximumSize">20097152</param>
                  <!-- 配置允许上传文件的类型,如果有多个类型,中间用","隔开 -->
                  <param name="fileUpload.allowedTypes">application/vnd.ms-powerpoint,application/octet-stream,text/plain</param>
                  <!-- 配置上传文件扩展名,如果有多个类型,中间用","隔开 -->
                  <param name="fileUpload.allowedExtensions">ppt</param>
               </interceptor-ref>
         
          * 测试
         
   * 在jsp页面处理异常:
         * 引入<%@ taglib uri="/struts-tags"   prefix="s"%>
         * 使用 <s:fielderror></s:fielderror>  显示错误处理信息
        
         * 默认情况下显示的异常是英文的,
              *  该异常在struts2-core-2.1.8.1.jar\org\apache\struts2\struts-messages.properties文件中存在
              *  内容如下:
                    struts.messages.error.uploading=Error uploading: {0}
                         struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
                         struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
                         struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
                                 
              * 含义:
                 {0}:<input type=“file” name=“uploadImage”>中name属性的值
                    {1}:上传文件的名称
                    {2}:上传文件保存到临时目录的名称
                    {3}:上传文件的类型(对struts.messages.error.file.too.large是上传文件的大小)
                   
                  * 测试
                                       
         * 显示信息为中文的
              * 在任意目录下,创建自定义的资源文件,本例为fileupload.properties
              * 在该资源文件中增加如下内容
                    struts.messages.error.uploading=上传错误: {0}
                         struts.messages.error.file.too.large=文件太大: {0} "{1}" "{2}" {3}
                         struts.messages.error.content.type.not.allowed=内容类型不允许: {0} "{1}" "{2}" {3}
                         struts.messages.error.file.extension.not.allowed=文件扩展名不允许: {0} "{1}" "{2}" {3}
             
              * 在struts.xml文件中加载资源文件
                       <!-- 加载国际化资源文件
                            * cn.upload.fileupload,加载上传为资源文件
                            -->
                            <constant name="struts.custom.i18n.resources"
                                      value="cn.upload.fileupload"></constant>
            
              * 测试
        
  
  
  

FileUpload 拦截器

标签:

原文地址:http://www.cnblogs.com/lflx/p/4398118.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!