`
intolong
  • 浏览: 7423 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[原创]让你的Strut2支持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借口的类

/**
 * @author <a href="http://intolong.spaces.live.com/">Jalen</a>
 */
public class CosMultiPartRequest implements MultiPartRequest {
    private MultipartRequest multi;
    private String defaultEncoding;
    private boolean maxSizeProvided;
    private int maxSize;

    @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
    public void setDefaultEncoding(String defaultEncoding) {
        this.defaultEncoding = defaultEncoding;
    }

    @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
    public void setMaxSize(String maxSize) {
        this.maxSizeProvided = true;
        this.maxSize = Integer.parseInt(maxSize);
    }

    @Override
    public String[] getContentType(String fieldName) {
        return new String[] { multi.getContentType(fieldName) };
    }

    @SuppressWarnings("unchecked")
    @Override
    public List getErrors() {
        return Collections.EMPTY_LIST;
    }

    @Override
    public File[] getFile(String fieldName) {
        return new File[] { multi.getFile(fieldName) };
    }

    @Override
    public String[] getFileNames(String fieldName) {
        return new String[] { multi.getFile(fieldName).getName() };
    }

    @SuppressWarnings("unchecked")
    @Override
    public Enumeration<String> getFileParameterNames() {
        return multi.getFileNames();
    }

    @Override
    public String[] getFilesystemName(String name) {
        return new String[] { multi.getFilesystemName(name) };
    }

    @Override
    public String getParameter(String name) {
        return multi.getParameter(name);
    }

    @SuppressWarnings("unchecked")
    @Override
    public Enumeration<String> getParameterNames() {
        return multi.getParameterNames();
    }

    @Override
    public String[] getParameterValues(String name) {
        return multi.getParameterValues(name);
    }

    @Override
    public void parse(HttpServletRequest request, String saveDir) throws IOException {
        if (maxSizeProvided) {
            multi = new MultipartRequest(request, saveDir, maxSize, defaultEncoding);
        } else {
            multi = new MultipartRequest(request, saveDir, defaultEncoding);
        }
    }
}

 

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

<constant name="struts.multipart.parser" value="cos" /> 


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

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

<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="cos" class="jalen.core.struts2.CosMultiPartRequest" /> 



大功告成。


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

 

处理基于http的文件上传,有这么几个opensource libO'ReillyCosApachefileupload,还有JspSmartSmartUpload

 

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

 

使用2M20M45M200M的上传大小测试三种组件所花费的时间(单位为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,这是最常出现的情况)时,CosFileUpload性能并没有好很多,但SmartUpload就已经开始显出弱势。随着容量的增大,FileUploadSmartUpload的性能下降非常快,直到200M容量时,SmartUpload已经不堪重负崩溃了,而Cos此时的花费时间比FileUpload少了20多秒,不能不说在本次的评测中,Cos的性能位居第一。

分享到:
评论
4 楼 windedge 2009-07-25  
lz这个不支持多文件上传..
3 楼 intolong 2009-01-15  
kjj 写道
hack 个人不赞同,以后如果升级,可就麻烦了,自定拦截器


其实Struts2内嵌的fileupload,还有plugin方式的pell都是通过实现MultiPartRequest接口来做的. 这个实现也是同理而已。
2 楼 kjj 2009-01-15  
hack 个人不赞同,以后如果升级,可就麻烦了,自定拦截器
1 楼 dhxlsfn 2009-01-15  
谢谢,我说struts2怎么不能用cos了

相关推荐

    JAVA COS上传实例支持Struts2

    COS这个文件上传组件可以说在几个开源的上传文件组件中性能是非常优秀的,上传速度很快(相比fileUpload,smart等组件),但在使用Struts2结合COS文件上传时要注意Struts2实现了自己的MultiPartRequest,这个过滤后的...

    struts2图片上传并预览

    1. 添加依赖:在项目中,你需要添加Struts2的核心库和文件上传插件。Struts2的FileUpload插件提供了处理文件上传的功能。确保`struts2-core`和`struts2-convention-plugin`以及`struts2-file-uploading-plugin`在你...

    struts2实现文件上传下载

    在`struts.xml`配置文件中,为需要支持文件上传的Action添加`params`和`fileUpload`拦截器,并设置允许的最大上传大小。例如: ```xml &lt;package name="default" namespace="/" extends="struts-default"&gt; ...

    Struts2多个文件上传

    在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...

    添加Struts2支持

    至此,你已经成功地为项目添加了Struts2支持。然而,这只是基础设置,真正的开发工作才刚刚开始。你需要根据你的业务逻辑,定义Action类,编写`struts.xml`配置,设定结果页面,并使用Struts2提供的各种标签库来渲染...

    struts2文件上传下载源代码

    1. **配置Struts2 Action**:在`struts.xml`配置文件中,你需要定义一个Action,该Action负责处理文件上传请求。Action的类需要继承自`ActionSupport`,并覆盖`execute()`方法,以便处理上传的文件。 2. **设置...

    swfuplaod+struts2实现多文件上传

    SWFUpload 是一款开源的Flash上传组件,...通过上述步骤和注意事项,你可以利用SWFUpload和Struts2构建一个功能强大且安全的多文件上传功能。在实际项目中,根据需求进行适当的定制和优化,以满足用户需求和系统安全。

    Struts2文件批量上传

    Struts2是一个强大的MVC框架,它提供了丰富的功能来支持文件上传操作,包括单个文件上传和批量文件上传。 在Struts2中,文件上传的核心组件是`Commons FileUpload`库,这是一个Apache提供的开源项目,专门用于处理...

    struts2 文件上传

    struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload

    Struts2之struts2文件上传详解案例struts011

    为了支持文件上传,我们需要创建一个继承自`org.apache.struts2.dispatcher.multipart.MultiPartRequest`的Action类,或者使用Struts2提供的`org.apache.struts2.views.util.DefaultMultiPartRequest`。这个类可以...

    原创struts2讲义2.pdf

    Struts2除了基本的功能之外,还提供了一系列高级特性,如文件上传、国际化的支持等。 ##### 4.2 文件上传与下载 文件上传是Web应用中常见的一项功能,Struts2提供了简单易用的方式来实现这一需求。 ##### 4.3 ...

    struts2文件上传jar

    Struts2是一个流行的...理解这些库的作用以及如何在Struts2框架中整合它们,是开发支持文件上传的web应用的关键步骤。正确配置和使用这些库,可以让你轻松地处理用户的文件上传请求,增强应用程序的功能和用户体验。

    Struts2视频教程

    - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **权限控制**:利用拦截器实现细粒度的权限控制,确保只有授权用户才能访问敏感...

    NetBeans Struts2 插件 惟一一个支持Struts2的IDE

    然而,虽然许多IDE支持Java Web开发,但不是所有IDE都内置了对Struts2的专门支持,这就是NetBeans Struts2插件的价值所在。 NetBeans Struts2插件为开发者提供了以下关键功能: 1. **智能代码补全**:在编写Action...

    struts2-scan_struts2-scan_struts2scan_scan_struts2漏洞_

    在使用"struts2-scan.py"这个Python脚本时,你需要确保你有相应的环境支持Python运行,并且对目标Struts2应用有一定的访问权限。通常,这个脚本会遍历一系列的漏洞测试用例,针对每个可能的漏洞进行探测。扫描完成后...

    struts2文件上传

    Struts2 文件上传是Java Web开发中常见的功能,主要用于接收用户通过表单上传的文件。在Struts2框架中,虽然它自身不处理`multipart/form-data`类型的请求,但它依赖于第三方库,如Apache Commons FileUpload,来...

    Struts2 经典flash上传文件

    在Struts2中,文件上传是常见的功能,尤其是在处理用户表单时,如图片、文档等文件的上传。在本案例中,我们将探讨如何使用Struts2与Flash技术相结合实现文件的上传,并且展示上传进度条,提高用户体验。 1. **...

    Struts2的常量详解

    struts.multipart.parser 属性指定处理 multipart/form-data 的 MIME 类型(文件上传)请求的框架,该属性支持 cos、pell 和 jakarta 等属性值,即分别对应使用 cos 的文件上传框架、pell 上传及 common-fileupload ...

    struts1和struts2的区别

    - **Struts2**: Struts2支持更加灵活的单元测试方式。Action可以通过依赖注入的方式初始化,因此可以更容易地模拟出不同的测试场景。 #### 表单处理 - **Struts1**: 使用ActionForm来封装表单数据。ActionForm是一...

    struts2jar包

    2. **xwork-core.jar**:XWork是Struts2的基础,它提供了一些基础功能,如类型转换、Ognl表达式支持、拦截器机制等。很多Struts2的功能都是基于XWork实现的。 3. **ognl.jar**:OGNL(Object-Graph Navigation ...

Global site tag (gtag.js) - Google Analytics