修正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( new String[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
 
 

你可能感兴趣的:(文件上传)