zoukankan      html  css  js  c++  java
  • Struts2集成cos(转)

    Struts2因License的原因早就不再支持Cos上传了,具体见http://struts.apache.org/2.1.6/docs/file-upload.html 的官方说明: 
    There was a third alternative, cos, but it was removed due to licensing incompatibilities. 

    目前是内嵌了commons-fileupload,同时通过plugin方式支持Pell。但是struts.properties依然没有更新,网上的文章也依然是通过修改struts.multipart.parser对应的值为cos来自动支持Cos。 

    我们先不考虑license因素,看看让Struts2怎么支持Cos: 
    1) 创建一个实现org.apache.struts2.dispatcher.multipart.MultiPartRequest借口的类

    Java代码  收藏代码
    1. /** 
    2.  * @author <a href="http://intolong.spaces.live.com/">Jalen</a> 
    3.  */  
    4. public class CosMultiPartRequest implements MultiPartRequest {  
    5.     private MultipartRequest multi;  
    6.     private String defaultEncoding;  
    7.     private boolean maxSizeProvided;  
    8.     private int maxSize;  
    9.   
    10.     @Inject(StrutsConstants.STRUTS_I18N_ENCODING)  
    11.     public void setDefaultEncoding(String defaultEncoding) {  
    12.         this.defaultEncoding = defaultEncoding;  
    13.     }  
    14.   
    15.     @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)  
    16.     public void setMaxSize(String maxSize) {  
    17.         this.maxSizeProvided = true;  
    18.         this.maxSize = Integer.parseInt(maxSize);  
    19.     }  
    20.   
    21.     @Override  
    22.     public String[] getContentType(String fieldName) {  
    23.         return new String[] { multi.getContentType(fieldName) };  
    24.     }  
    25.   
    26.     @SuppressWarnings("unchecked")  
    27.     @Override  
    28.     public List getErrors() {  
    29.         return Collections.EMPTY_LIST;  
    30.     }  
    31.   
    32.     @Override  
    33.     public File[] getFile(String fieldName) {  
    34.         return new File[] { multi.getFile(fieldName) };  
    35.     }  
    36.   
    37.     @Override  
    38.     public String[] getFileNames(String fieldName) {  
    39.         return new String[] { multi.getFile(fieldName).getName() };  
    40.     }  
    41.   
    42.     @SuppressWarnings("unchecked")  
    43.     @Override  
    44.     public Enumeration<String> getFileParameterNames() {  
    45.         return multi.getFileNames();  
    46.     }  
    47.   
    48.     @Override  
    49.     public String[] getFilesystemName(String name) {  
    50.         return new String[] { multi.getFilesystemName(name) };  
    51.     }  
    52.   
    53.     @Override  
    54.     public String getParameter(String name) {  
    55.         return multi.getParameter(name);  
    56.     }  
    57.   
    58.     @SuppressWarnings("unchecked")  
    59.     @Override  
    60.     public Enumeration<String> getParameterNames() {  
    61.         return multi.getParameterNames();  
    62.     }  
    63.   
    64.     @Override  
    65.     public String[] getParameterValues(String name) {  
    66.         return multi.getParameterValues(name);  
    67.     }  
    68.   
    69.     @Override  
    70.     public void parse(HttpServletRequest request, String saveDir) throws IOException {  
    71.         if (maxSizeProvided) {  
    72.             multi = new MultipartRequest(request, saveDir, maxSize, defaultEncoding);  
    73.         } else {  
    74.             multi = new MultipartRequest(request, saveDir, defaultEncoding);  
    75.         }  
    76.     }  
    77. }  

      

    2) 修改struts.xml,指定你的parser

    Java代码  收藏代码
    1. <constant name="struts.multipart.parser" value="cos" />   


    这个也可以通过修改struts.properties来,效果相同 
      

    3) 修改struts.xml,注册你的parser

    Java代码  收藏代码
    1. <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="cos" class="jalen.core.struts2.CosMultiPartRequest" />   



    大功告成。


    以下转贴个Cos和其他上传lib的性能对比,我自己并未实测:

    处理基于http的文件上传,有这么几个opensource lib,O'Reilly的Cos,Apache的fileupload,还有JspSmart的SmartUpload。

    网上查了下他们的性能对比,摘录如下:

    使用2M、20M、45M、200M的上传大小测试三种组件所花费的时间(单位为ms)结果是:

    2M

    第1次

    第2次

    第3次

    第4次

    平均

    Cos

    297

    203

    234

    245

    245

    FileUpload

    281

    312

    281

    312

    297

    SmartUpload

    531

    594

    485

    532

    536

    20M

    第1次

    第2次

    第3次

    第4次

    平均

    Cos

    2562

    2109

    2719

    2172

    2391

    FileUpload

    4062

    4140

    5360

    3922

    4371

    SmartUpload

    3453

    3094

    3078

    3547

    3293

    45M

    第1次

    第2次

    第3次

    第4次

    平均

    Cos

    4860

    4844

    5125

    5171

    5000

    FileUpload

    9000

    8391

    10375

    10078

    9461

    SmartUpload

    8265

    9187

    8672

    8856

    8745

    200M

    第1次

    第2次

    第3次

    第4次

    平均

    Cos

    55813

    52282

    54796

    51187

    53520

    FileUpload

    76343

    68531

    80954

    79031

    76215

    SmartUpload

    内存堆栈溢出

    从上述的表格对比中可以看出Cos始终保持着良好的性能。在上传量较小(容量<2M,这是最常出现的情况)时,Cos比FileUpload性能并没有好很多,但SmartUpload就已经开始显出弱势。随着容量的增大,FileUpload和SmartUpload的性能下降非常快,直到200M容量时,SmartUpload已经不堪重负崩溃了,而Cos此时的花费时间比FileUpload少了20多秒,不能不说在本次的评测中,Cos的性能位居第一。

  • 相关阅读:
    部署ApplicationEndpoint
    当某人将我添加到他的联系人列表时,禁止通知我。
    通讯簿电话号码同步相关问题
    selenium之调用js解决淘宝点击下一页问题(JAVA版)
    try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
    给checkbox添加属性 checked=" " 的话,该checkbox会否勾选上
    SVN版本控制安装全步骤
    安装Oracle步骤总结(第2次)
    onclick与addEventListener的区别
    Win8 环境变量位置
  • 原文地址:https://www.cnblogs.com/WenbinChen/p/4349237.html
Copyright © 2011-2022 走看看