博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
修正Strut2 自带上传拦截器功能
阅读量:6628 次
发布时间:2019-06-25

本文共 9047 字,大约阅读时间需要 30 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
使用java.util.concurrent.ThreadFactory来创建线程
查看>>
宅男程序员给老婆的计算机课程之5:设计模式
查看>>
PHPWAMP强行脱离依赖,在系统缺失必备组件或DLL受损的情况下依然能正常运行
查看>>
echo显示颜色
查看>>
UNIX高级环境编程: 终端登录过程-远程登录-进程组-Session-Linux启动过程-dup与重定向-守护进程...
查看>>
中国大数据科技传播联盟在京成立
查看>>
xargs 命令
查看>>
awk——报告生成器
查看>>
oracle 体系结构
查看>>
Nginx+Keepalived搭建高可用负载均衡集群
查看>>
VS2015 正式版中为什么没有了函数前面引用提示了?
查看>>
windows 系统的安装和虚拟机共享文件夹
查看>>
arp协议的混乱引发的思考--一个实例
查看>>
Why Public Cloud is Not a Security Concern
查看>>
配置XenDesktop一例报错-序列不包含任何元素
查看>>
javascript理解数组和数字排序
查看>>
微软同步框架入门之五--使用WCF同步远程数据
查看>>
Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
查看>>
理解SQL代理错误日志
查看>>
维护计划作业
查看>>