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

本文共 9034 字,大约阅读时间需要 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(
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
 
 

本文出自 “” 博客,请务必保留此出处

你可能感兴趣的文章
第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码
查看>>
Vivado增量式编译
查看>>
一个很好的幻灯片效果的jquery插件--kinMaxShow
查看>>
微信支付签名配置正确,但返回-1,调不出支付界面(有的手机能调起,有的不能)...
查看>>
第二周例行报告
查看>>
Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)...
查看>>
实验八 sqlite数据库操作
查看>>
四种简单的排序算法(转)
查看>>
Quartz2D之着色器使用初步
查看>>
多线程条件
查看>>
Git [remote rejected] xxxx->xxxx <no such ref>修复了推送分支的错误
查看>>
Porter/Duff,图片加遮罩setColorFilter
查看>>
黄聪:VMware安装Ubuntu10.10【图解】转
查看>>
Centos 6.x 升级openssh版本
查看>>
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>