- 浏览: 131512 次
- 性别:
-
文章分类
最新评论
-
seacow2008:
同1楼,深入浅出
Java并发编程(二) CountDownLatch -
Mojarra:
<div class="quote_title ...
fastupload 0.6.0发布 -
java0000wa:
不能搞得通俗易懂一点? demo Spring jar包都少了 ...
fastupload 0.6.0发布 -
Mojarra:
<div class="quote_title ...
fastupload 0.6.0发布 -
tegger:
不好意思设置字符编码解决了,还是挺好用的,不错
fastupload 0.6.0发布
fastupload 0.31版本上周已经发布,因为工作的关系,只到今天才有点时间来写一些0.31版本中深层次的东西。fastupload以前的版本,尽管在性能上取得了不小的进步,但只支持解析文件,不支持解析非文件的内容,因为HttpFileUploadParser这个类来解析ServletRequest的输入流的过程中,忽略非文件的请求数据。举个列子来说,假如表单中有两个input标签,一个是文本输入控件,一个是文件输入控件,经过HttpFileUploadParser解析后,只会把文件类型请求的数据保存在指定的目录下。
在fastupload项目编写之初,考虑的是如何把文件类型请求的数据保存到文件中去,在这种目标下,如何处理非文件类型请求数据?自然的”选择“了忽略这种方式。
在fastupload 0.23发布后 ,原计划是在下一个版本中提供对struts2、spring mvc3的注解(annotation)一些高级特性的支持,有些网友对fastupload提出了批评和建议,其中,网友silence1214 提出了对于非文件类型请求数据的处理问题。经过仔细考虑后,决定先实现非文件类型请求数据的处理。于是,0.31版本中,类HttpMemoryUploadParser能处理非文件类型的请求数据了,具体的示例代码如下,
MultiPartDataFactory mpdf = new MemoryMultiPartDataFactory("utf-8"); HttpMemoryUploadParser uploadParser = new HttpMemoryUploadParser(request, mpdf); long s = System.currentTimeMillis(); List<MultiPartData> list = uploadParser.parseList(); File dir = new File(System.getProperty("user.home") + "/memoryupload/dump"); dir.mkdirs(); for (MultiPartData e : list) { String target = String.format("%s/%s", dir.getAbsolutePath(), e.getFileName()); if (e.isFile()) { e.toFile(target); } else { System.out.println(new String(e.getContentBuffer())); } } System.out.format("memoryupload cost: %d %n", System.currentTimeMillis() - s);
当新建一个HttpMemoryUploadParser类的实例时,首先读取ServletRequest输入流中所有的字节,写入内存缓冲中,parseList()函数从这片大的缓冲中解析上传表单中的内容,返回一个包含MultiPartData类型的数组。
这里的MultiPartData是multipart/form-data中两个边界(boundary)中数据的一个抽象。上传请求数据中的头部信息表明这部分数据是一个文件中的内容,还是输入控件中“输入”的内容,MultiPartData.isFile()函数则实现了这个判断功能,此外,MultiPartData.getContentHeaderMap()函数把这些“头部信息”以Map的形式暴露出来,供外部代码使用。
在成功解析上传表单后,每个MultiPartData都有一个自己的一片内存缓冲,用于保存解析后所得出的数据,如果需要把这些数据保存到文件中去,则调用toFile()函数,如果想直接获得数据,则调用getContentBuffer()函数。需要提醒的是,创建MemoryMultiPartDataFactory时,指定了字符集,MemoryMultiPartDataFactory在创建MemoryMultiPartData对象时,对把name属性转换成所指定的字符集字符串,对于所解析出的内容,并不做字符集的转换,因为数据已经读入到内存中,开发人员可以对其转换成所期望的字符集,不象MultiPartTextFile写入时,需要强制进行字符集转换。
对于支持非文件类型请求后,fastupload和Apache Commons FileUpload的性能相比,是一个什么样的结果呢?继续做一个实际的测试对比,分别用fastupload的HttpMemoryUploadParser和Apache Commons FileUpload的相类似的API接受1.7M、1.7M和1.2M的图像文件。得到下面的测试结果,单位毫秒。
memoryupload cost: 10 memoryupload cost: 8 memoryupload cost: 11 memoryupload cost: 8 memoryupload cost: 12 memoryupload cost: 8 memoryupload cost: 48 memoryupload cost: 14 memoryupload cost: 346 memoryupload cost: 11 memoryupload cost: 8 memoryupload cost: 9 memoryupload cost: 14 memoryupload cost: 8 memoryupload cost: 14 memoryupload cost: 9 memoryupload cost: 10 memoryupload cost: 14 memoryupload cost: 10 memoryupload cost: 12 Apache Common File Upload costs: 379 Apache Common File Upload costs: 29 Apache Common File Upload costs: 66 Apache Common File Upload costs: 87 Apache Common File Upload costs: 92 Apache Common File Upload costs: 24 Apache Common File Upload costs: 195 Apache Common File Upload costs: 286 Apache Common File Upload costs: 25 Apache Common File Upload costs: 314 Apache Common File Upload costs: 50 Apache Common File Upload costs: 84 Apache Common File Upload costs: 217 Apache Common File Upload costs: 86 Apache Common File Upload costs: 314 Apache Common File Upload costs: 120
可以看出,两组数据中,最快的单次时间比是8:24,如果比较两组数据中前10个的平均值,这个比是8.8:51,如果比较最慢的10个数据的平均值,是49.6:229, 最慢的单次比值是 346:379,相差不大,平均时间比是29.2:140。
总的说来,得益于改进的BM查找算法,HttpMemoryUploadParser解析速度比Apache Commons FileUpload的要快好很多,速度上占据了绝对的优势,从最慢那个对比来看,fastupload仍然有提高的空间,比如说尽可能的优化内存的使用。
开源fastupload项目纯粹我当时的一个想法,没想到引起了广大网友的注意,不屑、质疑、建议、批评的都有,不管怎么说,你们的声音是fastupload项目前进中动力的重要部分,这里特别感谢广大网友。
发表评论
-
Fastupload 0.6.1 发布
2014-03-03 09:44 15770.6.1版本主要修复了JQuery-form提交ajax请 ... -
fastupload 0.6.0发布
2013-06-23 18:24 1789Fastupload 0.6.0完善或者新增加的功能有: ... -
uProfiler使用指南
2013-06-13 14:43 1566简介: uProfiler Community是面向主题 ... -
uProfiler Community 1.0发布
2013-06-08 09:39 2000uProfiler Community 1.0是面 ... -
fastupload-springmvc 0.5.5发布
2013-04-15 21:55 2014fastupload-springmvc是利用f ... -
Fastupload 0.5.3发布
2013-01-05 19:55 1001相对于以往的版本,fastupload 0.5.3做出了明 ... -
fastupload已发布至maven中心库
2012-11-29 09:44 1037为了让大家更方便的使用fastupload开源项目,fastu ... -
白话MVC(五)初窥Spring MVC
2012-11-22 21:17 2267在 为 struts2 项 目写完 fastuplo ... -
Fastupload 0.4.7发布,支持struts2
2012-10-28 20:56 1763Fastupload 0.4.7这个版本中主要增加了支持str ... -
白话MVC(四)为Struts2编写文件上传插件
2012-10-28 20:47 3198Struts2中,在Dispatcher.java ... -
Fastupload 0.4.2发布
2012-10-19 12:05 1551更新:fastupload 0.4.2支 ... -
fastupload召集开源开发志愿者
2012-10-11 19:57 98fastupload开源项目自发布0.3.5版本后,文件上传的 ... -
白话MVC(三)Struts2拦截器巧妙装配Model Bean
2012-10-12 18:02 2044白话MVC(二) 在Struts的过滤器中,经过调用Prep ... -
白话MVC(二)Struts2中Model的处理基础-ActionContext
2012-10-09 13:17 2458白话MVC(一) ... -
白话MVC(一)Model的产生及处理
2012-09-29 00:36 34704白话MVC(二) 最近在带一“徒弟”,领悟能力很高,对我 ... -
fastupload API开发快速上手
2012-09-01 16:36 2915fastupload提供两种从multipart/form-d ... -
fastupload 0.3.1发布
2012-08-21 15:25 1734fastupload根据RFC 1867文档 ... -
开源项目fastupload 0.2.3发布
2012-07-06 17:19 2016fastupload 0.2.3发布,增加了对sub-boun ... -
文件上传的秘密(四)大小限制与进度
2012-05-28 14:27 8422RFC1867规范中,对表单上传文件的大小和进度都没有作出规定 ... -
文件上传的秘密(三)性能和稳定性上的衡量
2012-05-19 22:42 2953文件上传的秘密系列之一, http://mojarra.ite ...
相关推荐
超级文件粉碎机3.1.0.31
批量文件改名(1.4.0.31) 2008年12月26日更新 1.支持历史操作恢复,以防操作失误丢失原始文件; 2.支持多文件类型,用户可根据需要自行添加类型; 3.支持按要求自定义文件命名规则; 3.支持文件选择时文件及时浏览...
换位消除-0.31版本 工程源码(有点击焦点的显示,内含运行截图),功能是通过点击交换两个方块,有三个或以上相邻相同方块连成一行或一列,即可消除并得分。最近点击的两个方块有焦点方框显示。一个用于学习的unity...
### D-Bus Specification 0.31:详细...综上所述,D-Bus 0.31版本通过对现有功能的改进和新功能的添加,显著提升了系统的可靠性和灵活性。这些改进不仅对开发者有益,也极大地促进了基于D-Bus的应用程序和服务的发展。
2009-12-13 0.31版本:(截止到这个版本,除了日志输入,我想大家在杀病毒方面需求比较多的功能都加入了,因此这个工具也就告一段落了) 1.修正几个Bug 2.新增对常用文件关联的检测 3.新弄了个配置文件(详细配置文件,也...
frp 0.31.2版本的linux windows mac OSX系统安装包 frp_0.31.2_darwin_amd64.tar.gz frp_0.31.2_freebsd_386.tar.gz frp_0.31.2_freebsd_amd64.tar.gz frp_0.31.2_linux_386.tar.gz frp_0.31.2_linux_amd64.tar...
jsonplugin-0.31.jar 使用JSON的一个架包.
【SuggestFramework-0.31学习实例】是一个专门针对SuggestFramework 0.31版本的实践教程,旨在帮助用户深入理解和应用该框架。这个框架可能是用于推荐系统、建议生成或者智能搜索等相关领域的解决方案。在本文中,...
3. **图像编辑功能**:除了基本的裁剪、旋转、调整亮度和对比度外,XnViewMP还提供了高级编辑功能,如色彩平衡、曲线调整、红眼消除和降噪,满足专业用户的需要。 4. **幻灯片展示**:软件内置了幻灯片播放功能,...
这个名为"PandasColorPrinter-0.31.tar.gz"的压缩包,包含了0.31版本的`PandasColorPrinter`,它是一款旨在提升Pandas数据框打印效果的工具,通过丰富的色彩和格式增强,使得数据展示更加直观易懂。 `...
这将解压缩出一个名为BananaRPSLibV2-0.31的目录,该目录通常包含README文件(用于介绍库的用途和用法)、setup.py(定义了库的安装信息)、源代码文件(如.py文件)以及其他必要的资源。然后,开发者可以查看README...
今天,我们要聚焦的是名为“neon”的一个关键组件,具体版本为0.31.2,它被封装在一个名为“neon-0.31.2.tar.gz”的压缩包中。这个文件的格式——.tar.gz,是我们常见的Linux和Unix系统中用于存储和分发源代码的档案...
这次提供的"plutosdr-fw-v0.31.zip"是一个固件更新包,版本号为0.31,通常意味着对之前版本的改进和增强。 首先,让我们了解固件更新的重要性。固件是设备内部控制硬件行为的软件,它决定了设备的功能和性能。定期...
标题中的"PyPI 官网下载 | trueface-0.31.tar.gz"指的是Python Package Index(PyPI)上发布的名为`trueface`的软件包的0.31版本,该版本以`.tar.gz`格式提供。PyPI是Python开发者发布自己编写的Python模块、库或...
可以与Scrt和Putty实现Linux图形化界面
标题中的"PyPI 官网下载 | bashrc-0.31.5.tar.gz"表明这是一个从Python Package Index(PyPI)官方下载的资源,名为`bashrc-0.31.5`,且文件格式为`.tar.gz`。PyPI是Python开发者发布和分享他们创建的Python库的地方...
这个压缩包文件“AMD SMBus_5.12.0.31_1-18-2015_6.1_x64.zip”包含了AMD SMBus驱动的特定版本,日期为2015年1月18日,适用于64位(x64)操作系统。 在该压缩包中,有三个关键文件: 1. **SMbusamd.cat**:这是一...
AnalyzerBeans-core-0.31.zip 是一个包含AnalyzerBeans核心组件的压缩文件,版本为0.31。AnalyzerBeans可能是用于分析数据或执行特定任务的Java库。它可能提供了丰富的API和工具,使得开发者能够方便地集成到他们的...
Snippy 0.31的主要功能是允许用户轻松截取屏幕上任意形状的区域,并将截图内容快速存入剪贴板。这一特性使得它在处理各种工作场景时都能游刃有余,无论是为了记录问题、分享信息,还是进行教学演示,都能发挥出色的...
本资源是一个名为"uswapper"的Python库,版本为0.31,对应的文件是`uswapper-0.31-py3-none-any.whl`。这个文件是一种特殊的打包格式,用于方便安装Python包,它是由Python的wheel项目提供的。 Python的wheel文件是...