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

原文地址:https://www.cnblogs.com/WenbinChen/p/4349237.html