修正Strut2 自带上传拦截器功能

简介:
Struts2字典的FileUploadInterceptor 拦截器 主要帮助获取上传文件的ContentType、fileName、文件对象。如果开发人员在开发过程中使用。则需要设置set/get方法:
比如
setXXXContentType() 
getXXXFileName() 
getXXXContentType() 
setXXXFileName() 
getXXXFile() 
setXXXFile()
其中,"xxx"为渲染器的name.
 
问题在这里
第一,如果除了ContentType/File/FileName ,还需要其他的消息怎么办呢。拦截器就无能为力了。 这个可以忽略。
 
第二,平时在开发过程中,我们经常有动态添加附件功能。如果上传的附件同属于一类的话,还尚可。但是,如果一个页面中,需要上传多种类型的附件,而且每个附件类型动态增加的。拦截器就有点力不从心了。只能针对每个类型的附件,在Action中写多个方法。
setType1File();
setType2File();
setType1ContentType();
setType2ContentType();
setType1FileName();
setType2FileName();
---------
问题在这里。如果我再增加一个类型呢?
在深层挖掘一下,如果我想做一个公共的文件上传处理类,怎么办。
本人研究了下自带的拦截器,在此基础上,通过自己的实践,提出自己的一个解决方案。
 
我通过Map 来管理上传的文件列表。这样就不惧怕多类型文件上传,且可扩展性也提高了。
修正后的Strut2 FileUploadInterceptor 如下
public String intercept(ActionInvocation invocation)  throws Exception { 
                ActionContext ac = invocation.getInvocationContext(); 

                HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST); 

                 if (!(request  instanceof MultiPartRequestWrapper)) { 
                         if (LOG.isDebugEnabled()) { 
                                ActionProxy proxy = invocation.getProxy(); 
                                LOG.debug(getTextMessage( "struts.messages.bypass.request"new Object[]{proxy.getNamespace(), proxy.getActionName()}, ac.getLocale())); 
                        } 

                         return invocation.invoke(); 
                } 

                ValidationAware validation =  null

                Object action = invocation.getAction(); 

                 if (action  instanceof ValidationAware) { 
                        validation = (ValidationAware) action; 
                } 

                MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) request; 

                 if (multiWrapper.hasErrors()) { 
                         for (String error : multiWrapper.getErrors()) { 
                                 if (validation !=  null) { 
                                        validation.addActionError(error); 
                                } 

                                LOG.warn(error); 
                        } 
                } 

                 // bind allowed Files 
                Enumeration fileParameterNames = multiWrapper.getFileParameterNames(); 
                Map<String,List<Map<String,Object>>> fileParameterMap =  new HashMap<String,List<Map<String,Object>>>(); //文件值对 //zhaogy 
                 while (fileParameterNames !=  null && fileParameterNames.hasMoreElements()) { 
                         // get the value of this input tag 
                        String inputName = (String) fileParameterNames.nextElement(); 
                         
                         // get the content type 
                        String[] contentType = multiWrapper.getContentTypes(inputName); 
                         
                         if (isNonEmpty(contentType)) { 
                                 // get the name of the file from the input tag 
                                String[] fileName = multiWrapper.getFileNames(inputName); 

                                 if (isNonEmpty(fileName)) { 
                                         // get a File object for the uploaded File 
                                        File[] files = multiWrapper.getFiles(inputName); 
                                         if (files !=  null && files.length > 0) { 
                                                List<File> acceptedFiles =  new ArrayList<File>(files.length); 
                                                List<String> acceptedContentTypes =  new ArrayList<String>(files.length); 
                                                List<String> acceptedFileNames =  new ArrayList<String>(files.length); 
                                                List<String> renderNames =  new ArrayList<String>(files.length); 
                                                String contentTypeName = inputName +  "ContentType"
                                                String fileNameName = inputName +  "FileName"
                                                 for ( int index = 0; index < files.length; index++) { 
                                                         if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) { 
                                                                acceptedFiles.add(files[index]); 
                                                                acceptedContentTypes.add(contentType[index]); 
                                                                acceptedFileNames.add(fileName[index]); 
                                                                List<Map<String, Object>> vfl= null
                                                                 if(fileParameterMap.containsKey(inputName)){ //是否已存在 
                                                                  vfl = fileParameterMap.get(inputName); 
                                                                } else
                                                                  vfl =  new ArrayList<Map<String,Object>>(); 
                                                                  fileParameterMap.put(inputName, vfl); 
                                                                } 
                                                                  Map<String, Object> value =  new HashMap<String,Object>(); 
                                                                  value.put( "contentType", contentType[index]); 
                                                                  value.put( "fileName", fileName[index]); 
                                                                  value.put( "acceptedFile", files[index]); 
                  vfl.add(value); 
                                                                 
                                                        } 
                                                } 

                                                 if (!acceptedFiles.isEmpty()) { 
                                                        Map<String, Object> params = ac.getParameters(); 
                                                        params.put(inputName, acceptedFiles.toArray( new File[acceptedFiles.size()])); 
                                                        params.put(contentTypeName, acceptedContentTypes.toArray( newString[acceptedContentTypes.size()])); 
                                                        params.put(fileNameName, acceptedFileNames.toArray( new String[acceptedFileNames.size()])); 
                                                        params.put( "fileParameterMap", fileParameterMap); // zhaogy 
                                                } 
                                        } 
                                }  else { 
                                        LOG.warn(getTextMessage(action,  "struts.messages.invalid.file"new Object[]{inputName}, ac.getLocale())); 
                                } 
                        }  else { 
                                LOG.warn(getTextMessage(action,  "struts.messages.invalid.content.type"new Object[]{inputName}, ac.getLocale())); 
                        } 
                } 

                 // invoke action 
                String result = invocation.invoke(); 

                 // cleanup 
                fileParameterNames = multiWrapper.getFileParameterNames(); 
                 while (fileParameterNames !=  null && fileParameterNames.hasMoreElements()) { 
                        String inputValue = (String) fileParameterNames.nextElement(); 
                        File[] files = multiWrapper.getFiles(inputValue); 

                         for (File currentFile : files) { 
                                 if (LOG.isInfoEnabled()) { 
                                        LOG.info(getTextMessage(action,  "struts.messages.removing.file"new Object[]{inputValue, currentFile}, ac.getLocale())); 
                                } 

                                 if ((currentFile !=  null) && currentFile.isFile()) { 
                                         if (currentFile.delete() ==  false) { 
                                                LOG.warn( "Resource Leaking:    Could not remove uploaded file '" + currentFile.getCanonicalPath() +  "'."); 
                                        } 
                                } 
                        } 
                } 

                 return result; 
        }
 
 
 
测试代码:
/* 
* $Id: MultipleFileUploadUsingListAction.java 660522 2008-05-27 14:08:00Z jholmes $ 

* Licensed to the Apache Software Foundation (ASF) under one 
* or more contributor license agreements.    See the NOTICE file 
* distributed with this work for additional information 
* regarding copyright ownership.    The ASF licenses this file 
* to you under the Apache License, Version 2.0 (the 
* "License"); you may not use this file except in compliance 
* with the License.    You may obtain a copy of the License at 

*    http://www.apache.org/licenses/LICENSE-2.0 

* Unless required by applicable law or agreed to in writing, 
* software distributed under the License is distributed on an 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
* KIND, either express or implied.    See the License for the 
* specific language governing permissions and limitations 
* under the License. 
*/
 
// START SNIPPET: entire-file 
package org.apache.struts2.showcase.fileupload; 
import java.io.File; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 

import com.opensymphony.xwork2.ActionSupport; 

/** 
* Showcase action - multiple file upload using List 
* @version $Date: 2008-05-27 16:08:00 +0200 (Tue, 27 May 2008) $ $Id: MultipleFileUploadUsingListAction.java 660522 2008-05-27 14:08:00Z jholmes $ 
*/
 
public  class MultipleFileUploadUsingListAction  extends ActionSupport { 

         private List<File> uploads =  new ArrayList<File>(); 
         private List<String> uploadFileNames =  new ArrayList<String>(); 
         private List<String> uploadContentTypes =  new ArrayList<String>(); 

   public  void setFileParameterMap( 
      Map<String, List<Map<String, Object>>> fileParameterMap) { 
     this.fileParameterMap = fileParameterMap; 
  } 
   public List<File> getUpload() { 
                 return  this.uploads; 
        } 
         public  void setUpload(List<File> uploads) { 
                 this.uploads = uploads; 
        } 

         public List<String> getUploadFileName() { 
                 return  this.uploadFileNames; 
        } 
         
         
         public  void setUploadFileName(List<String> uploadFileNames) { 
                 this.uploadFileNames = uploadFileNames; 
        } 

         public List<String> getUploadContentType() { 
                 return  this.uploadContentTypes; 
        } 
         public  void setUploadContentType(List<String> contentTypes) { 
                 this.uploadContentTypes = contentTypes; 
        } 
         private Map<String,List<Map<String,Object>>> fileParameterMap; 

         public Map<String, List<Map<String, Object>>> getFileParameterMap() { 
     return fileParameterMap; 
  } 
         
         public String upload()  throws Exception { 
          Iterator<String> iter =  this.fileParameterMap.keySet().iterator(); 
     while(iter.hasNext()){ 
             String key = iter.next(); 
             List<Map<String, Object>>    vs =  this.fileParameterMap.get(key); 
             System.out.println( "key========"+key); 
              for(Map<String, Object> v : vs){ 
                Object contentType = v.get( "contentType"); 
                Object fileName = v.get( "fileName"); 
              Object file =    v.get( "acceptedFile"); 
              System.out.println( "contentType>>"+contentType); 
              System.out.println( "fileName>>"+fileName); 
              System.out.println( "file>>"+file); 
             } 
          } 
//                System.out.println("\n\n upload1"); 
//                System.out.println("files:"); 
//                for (File u: uploads) { 
//                        System.out.println("*** "+u+"\t"+u.length()); 
//                } 
//                System.out.println("filenames:"); 
//                for (String n: uploadFileNames) { 
//                        System.out.println("*** "+n); 
//                } 
//                System.out.println("content types:"); 
//                for (String c: uploadContentTypes) { 
//                        System.out.println("*** "+c); 
//                } 
//                System.out.println("\n\n"); 
                 return SUCCESS; 
        } 

// END SNIPPET: entire-file
 
输出
key========upload2
contentType>>application/octet-stream
fileName>>xm_xvs.cfg
file>>D:\Tomcat-6.0.20\work\Catalina\localhost\struts2-showcase\upload_8c1aaae_1372ca9bef5__8000_00000011.tmp
contentType>>text/html
fileName>>login.html
file>>D:\Tomcat-6.0.20\work\Catalina\localhost\struts2-showcase\upload_8c1aaae_1372ca9bef5__8000_00000012.tmp
key========upload
contentType>>text/plain
fileName>>说明.txt
file>>D:\Tomcat-6.0.20\work\Catalina\localhost\struts2-showcase\upload_8c1aaae_1372ca9bef5__8000_00000008.tmp
contentType>>application/vnd.openxmlformats-officedocument.wordprocessingml.document
fileName>>孕妇饮食注意事项.docx
file>>D:\Tomcat-6.0.20\work\Catalina\localhost\struts2-showcase\upload_8c1aaae_1372ca9bef5__8000_00000009.tmp
 
 本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/857866,如需转载请自行联系原作者
相关文章
|
2月前
|
NoSQL Java API
SpringBoot项目中防止表单重复提交的两种方法(自定义注解解决API接口幂等设计和重定向)
SpringBoot项目中防止表单重复提交的两种方法(自定义注解解决API接口幂等设计和重定向)
67 0
|
7月前
|
数据安全/隐私保护
fastadmin中写接口是时Validate规则验证自定义如何用
fastadmin中写接口是时Validate规则验证自定义如何用
|
存储 缓存 安全
SpringMVC源码剖析之自动注入Request,为什么可行?
我们知道在SpringMVC中controller层可以通过Autowire自动注入Request到当前类来使用。如果看过Spring源码,IOC容器进行实例化bean的时候,一级缓存中存放的都是单例Bean。
232 0
SpringMVC源码剖析之自动注入Request,为什么可行?
|
缓存 前端开发 Java
strut2运行流程的详解
strut2运行流程的详解
81 0
strut2运行流程的详解
|
NoSQL 安全 Java
几行代码,搞定 SpringBoot 接口恶意刷新和暴力请求!
几行代码,搞定 SpringBoot 接口恶意刷新和暴力请求!
|
SQL JSON Java
Mybaties(十五) 分页插件使用, 参数校验以及全局异常处理
这里是Mybaties中高级应用了, 基于Mybaties+Springboot实现分页, 参数校验以及全局异常(干货满满!!!)
|
前端开发 Java Spring
基于SpringBoot参数校验器拓展自定义参数校验
想必工作中大家为了保证接口的稳定性与安全性都会对入参进行校验。五花八门的校验写法会让我们的代码不够整洁,本文将介绍如何使用SpringBoot为我们提供的参数校验器,并对其进行扩展,让其能够实现自定义校验。当然在一些互联网项目中,为保证接口的高性能,校验都是放在前端做的,但是在阿里开发规约中是这样说的越是简单的接口越不需要进行参数校验,越是复杂的接口越需要参数校验,因为复杂的接口试错成本很高,校验对接口性能的影响微乎其微。
272 0
|
前端开发 Java Spring
实战篇:解决swagger和自定义参数解析器的功能冲突
实战篇:解决swagger和自定义参数解析器的功能冲突
696 0
实战篇:解决swagger和自定义参数解析器的功能冲突
|
XML 前端开发 Java
Struts2编写自定义验证拦截敏感词汇(十二)
Struts2编写自定义验证拦截敏感词汇(十二)
239 0
Struts2编写自定义验证拦截敏感词汇(十二)
|
JSON 前端开发 Java
springboot 全局异常拦截器,友好异常提示
springboot 全局异常拦截器,友好异常提示
388 0
springboot 全局异常拦截器,友好异常提示