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 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的性能位居第一。
分享到:
相关推荐
COS这个文件上传组件可以说在几个开源的上传文件组件中性能是非常优秀的,上传速度很快(相比fileUpload,smart等组件),但在使用Struts2结合COS文件上传时要注意Struts2实现了自己的MultiPartRequest,这个过滤后的...
1. 添加依赖:在项目中,你需要添加Struts2的核心库和文件上传插件。Struts2的FileUpload插件提供了处理文件上传的功能。确保`struts2-core`和`struts2-convention-plugin`以及`struts2-file-uploading-plugin`在你...
在`struts.xml`配置文件中,为需要支持文件上传的Action添加`params`和`fileUpload`拦截器,并设置允许的最大上传大小。例如: ```xml <package name="default" namespace="/" extends="struts-default"> ...
在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...
至此,你已经成功地为项目添加了Struts2支持。然而,这只是基础设置,真正的开发工作才刚刚开始。你需要根据你的业务逻辑,定义Action类,编写`struts.xml`配置,设定结果页面,并使用Struts2提供的各种标签库来渲染...
1. **配置Struts2 Action**:在`struts.xml`配置文件中,你需要定义一个Action,该Action负责处理文件上传请求。Action的类需要继承自`ActionSupport`,并覆盖`execute()`方法,以便处理上传的文件。 2. **设置...
SWFUpload 是一款开源的Flash上传组件,...通过上述步骤和注意事项,你可以利用SWFUpload和Struts2构建一个功能强大且安全的多文件上传功能。在实际项目中,根据需求进行适当的定制和优化,以满足用户需求和系统安全。
Struts2是一个强大的MVC框架,它提供了丰富的功能来支持文件上传操作,包括单个文件上传和批量文件上传。 在Struts2中,文件上传的核心组件是`Commons FileUpload`库,这是一个Apache提供的开源项目,专门用于处理...
struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload
为了支持文件上传,我们需要创建一个继承自`org.apache.struts2.dispatcher.multipart.MultiPartRequest`的Action类,或者使用Struts2提供的`org.apache.struts2.views.util.DefaultMultiPartRequest`。这个类可以...
Struts2除了基本的功能之外,还提供了一系列高级特性,如文件上传、国际化的支持等。 ##### 4.2 文件上传与下载 文件上传是Web应用中常见的一项功能,Struts2提供了简单易用的方式来实现这一需求。 ##### 4.3 ...
Struts2是一个流行的...理解这些库的作用以及如何在Struts2框架中整合它们,是开发支持文件上传的web应用的关键步骤。正确配置和使用这些库,可以让你轻松地处理用户的文件上传请求,增强应用程序的功能和用户体验。
- **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **权限控制**:利用拦截器实现细粒度的权限控制,确保只有授权用户才能访问敏感...
然而,虽然许多IDE支持Java Web开发,但不是所有IDE都内置了对Struts2的专门支持,这就是NetBeans Struts2插件的价值所在。 NetBeans Struts2插件为开发者提供了以下关键功能: 1. **智能代码补全**:在编写Action...
在使用"struts2-scan.py"这个Python脚本时,你需要确保你有相应的环境支持Python运行,并且对目标Struts2应用有一定的访问权限。通常,这个脚本会遍历一系列的漏洞测试用例,针对每个可能的漏洞进行探测。扫描完成后...
Struts2 文件上传是Java Web开发中常见的功能,主要用于接收用户通过表单上传的文件。在Struts2框架中,虽然它自身不处理`multipart/form-data`类型的请求,但它依赖于第三方库,如Apache Commons FileUpload,来...
在Struts2中,文件上传是常见的功能,尤其是在处理用户表单时,如图片、文档等文件的上传。在本案例中,我们将探讨如何使用Struts2与Flash技术相结合实现文件的上传,并且展示上传进度条,提高用户体验。 1. **...
struts.multipart.parser 属性指定处理 multipart/form-data 的 MIME 类型(文件上传)请求的框架,该属性支持 cos、pell 和 jakarta 等属性值,即分别对应使用 cos 的文件上传框架、pell 上传及 common-fileupload ...
- **Struts2**: Struts2支持更加灵活的单元测试方式。Action可以通过依赖注入的方式初始化,因此可以更容易地模拟出不同的测试场景。 #### 表单处理 - **Struts1**: 使用ActionForm来封装表单数据。ActionForm是一...
2. **xwork-core.jar**:XWork是Struts2的基础,它提供了一些基础功能,如类型转换、Ognl表达式支持、拦截器机制等。很多Struts2的功能都是基于XWork实现的。 3. **ognl.jar**:OGNL(Object-Graph Navigation ...