• 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的性能位居第一。

  • 相关阅读:
    Jmeter之Bean shell使用(一)
    CSS知识点 2
    0523 CSS知识点
    0522 HTML表单 CSS基础
    0521 HTML基础
    0515线程
    0514 队列 管道 进程池 回调函数
    0510进程 multiprocess模块
    0509操作系统发展史 进程
    0507黏包
  • 原文地址:https://www.cnblogs.com/WenbinChen/p/4349237.html
Copyright © 2020-2023  润新知