- 浏览: 128874 次
- 性别:
文章分类
最新评论
-
seacow2008:
同1楼,深入浅出
Java并发编程(二) CountDownLatch -
Mojarra:
java0000wa 写道不能搞得通俗易懂一点? demo S ...
fastupload 0.6.0发布 -
java0000wa:
不能搞得通俗易懂一点? demo Spring jar包都少了 ...
fastupload 0.6.0发布 -
Mojarra:
tegger 写道不好意思设置字符编码解决了,还是挺好用的,不 ...
fastupload 0.6.0发布 -
tegger:
不好意思设置字符编码解决了,还是挺好用的,不错
fastupload 0.6.0发布
fastupload API开发快速上手
- 博客分类:
- fastupload
- 山寨与创新
fastupload提供两种从multipart/form-data表单请求数据中解析文件的方法,直接法和批量法
直接法:
是fastupload提供的第一种解析方法,从HttpServletRequest的InputStream中每次读取不超过8K的数据到缓冲区之中,从这个缓冲区里解析是否有文件,或者是文件的一部分数据,把每次解析的结果“直接 ”保存到磁盘文件中去。fastupload最先实现的是这种方式,这种方式一个好处就是对内存的占用非常小,解析内容的缓冲只有8K。因此非常适合那种对内存要求很苛刻的应用场景,而且解析的速度也非常快,这里有几组比较数据,可以参考一下,http://mojarra.iteye.com/blog/1581521, http://mojarra.iteye.com/blog/1579986
具体的API使用如下
DiskFileFactory dff = new DiskFileFactory(System.getProperty("user.home")); DiskFileFactory dff = new DiskFileFactory(System.getProperty("user.home") , "utf-8"); DiskFileFactory dff = new DiskFileFactory(System.getProperty("user.home") , "utf-8", 0x20000); dff.setParseThreshold(0x100000); HttpFileUploadParser parser = new HttpFileUploadParser(req, dff); List<MultiPartFile> files = parser.parse();
在解析文件之前,需要创建DiskFileFactory工厂,用来指定解析时用来的一些必要的“数据”,DiskFileFactory有三种构造函数,
第一种,创建DiskFileFactory工厂,文件保存在用户home目录下,使用jdk默认的文件编码,无文件大小限制
第二种,创建DiskFileFactory工厂,文件保存在用户home目录下,使用utf-8编码,无文件大小限制
第三种,创建DiskFileFactory工厂,文件保存在用户home目录下,使用utf-8编码,文件大小限制在0x20000
上面的列子中,第四行代码可以和这三个构造函数配合使用,来限制整个请求的数据的大小,如果指定了整个请求数据的大小,即指定了ParseThreshold的值,类HttpFileUploadParser在解析文件之前,先和HttpServletRequest的Content-Length相比较,如果发现ParseThreshold>Content-Length,直接抛出ThresholdException异常。
这里稍微提醒一下,因为HTTP协议的规定,HTTP请求的Content-Length会比上传文件的实际字节数稍微大一点。
上面代码的第五、六行,创建HttpFileUploadParser对象,并解析文件。如果指定了字符编码,解析过程中把文件名转换成所指定的字符编码,除此之外,若解析过程发现了文本文件,也会对文件的内容进行转码。
批量法:
fastupload提供的第二种解析方式,是把HttpServletRequest的InputStream中所有的数据都读取到一片大的缓冲区中(相对于第一种方式种所采用的8K缓冲区,不知道要大多少倍的),再从这片大的缓冲区中,解析multipart/form-data数据中的文件或者其他输入内容。解析出来的数据通过MultiPartData类中提供的一些API,让API使用者可以对这些数据进行操作。
因为是把HttpServletRequest的InputStream中所有的数据读入缓冲后,做一次解析的,所以批量法解析的速度是非常快的,比第一种要快3倍以上,因此,批量法非常适合那种对速度相应要快,不太介意内存使用、高并发上传小文件的场合。
这里与直接法有些不同,批量法除了支持解析文件外,还支持解析multipart/form-data中非文件的上传数据,比如表单中的文本输入框中用户手工的输入数据。
MultiPartDataFactory mpdf = new MemoryMultiPartDataFactory(); MultiPartDataFactory mpdf = new MemoryMultiPartDataFactory("utf-8"); MultiPartDataFactory mpdf = new MemoryMultiPartDataFactory("utf-8", 0x20000); mpdf.setParseThreshold(0x100000); HttpMemoryUploadParser httpMemoryUploadParser = new HttpMemoryUploadParser( request, mpdf); List<MultiPartData> list = httpMemoryUploadParser.parseList(); for (MultiPartData e : list) { String target = String.format("%s/%s", dir.getAbsolutePath(), e.getFileName()); if (e.isFile()) { e.toFile(target); } else { if (e.getBytes() > 0) System.out.println(new String(e.getContentBuffer())); } }
创建MemoryMultiPartDataFactory 与创建DiskFileFactory基本相同,只不过少了一个path参数,(确实,内存中的数据不需要path ),编码、文件大小限制,解析总长度与DiskFileFactory都起着一样的作用,这里不在复述。
经过httpMemoryUploadParser解析出的multipart/form-data表单中的各部分内容,都会保存在一个包含MultiPartData对象的数组之中,API使用者可以MultiPartData类封装的几个与上传内容重点相关的函数来访问解析的内容。
-
MultiPartData.getName(), 返回表单中输入控件的名字,如<intput type="text" name="text1"/>,那么此函数返回text1。
-
MultiPartData.getFileName(),返回表单中文件输入控件的文件名字,如用户在某文件输入框中选择了名为“my cat.jpg",此函数返回"my cat.jpg"
- MultiPartData.isFile(),此函数判断该MultiPartData对象是不是文件类型的数据,如果是,返回true,否则返回false。
-
MultiPartData.toFile(String target),把当前MultiPartData对象中的数据缓冲写入到指定的文件当中去。写入成功,返回true,如果该对象中无任何数据,直接返回false
- MultiPartData.getContentBuffer(),返回MultiPartData对象中数据缓冲,如果该MultiPartData不包含任何数据,返回null
- MultiPartData.getBytes(),返回该MultiPartData对象中数据缓冲的字节数。如果是0,表示当前对象中不包含任何数据
[暂时写这么多,欢迎大家提意见,我会继续完善]
- fastupload-0.3.5-SNAPSHOT-sources.jar (20.9 KB)
- 下载次数: 23
- fastupload-0.3.5-SNAPSHOT.jar (30.1 KB)
- 下载次数: 23
评论
请下载最新的版本,https://sourceforge.net/projects/fastupload/
demo的代码如下
@WebServlet("/MemoryUpload") public class MemoryUpload extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { File dir = new File(System.getProperty("user.home") + "/memoryupload/dump"); dir.mkdirs(); FileFactory mpdf = new MemoryMultiPartDataFactory("utf-8"); HttpMemoryUploadParser uploadParser = new HttpMemoryUploadParser( request, mpdf); long s = System.currentTimeMillis(); List<MultiPartFile> list = uploadParser.parseList(); for (MultiPartFile e : list) { if (e.isFile()) { String target = String.format("%s/%s", dir.getAbsolutePath(), e.getFileName()); e.toFile(target); } else { if (e.getBytes() > 0) System.out.println(new String(e.getContentBuffer())); } } System.out.format("save disk costs: %d %n", System.currentTimeMillis() - s); } }
从表单里上传了本地的C:\upload.txt文件,其对应的文件名则是upload.txt
传上去的名字就是一个C
估计是取了C:\upload.txt的第一个字吧
求指教
程序中打印的
Content-Disposition: form-data
name="file1"
filename="C:\upload.txt"
Content-Type: text/plain
-----------------------------
不过在chrome中的确是文件名,但是IE下就是全路径
可能是我哪边做得不对吗
求调教,
你做的没有错,这个问题应该跟IE的实现有关系,在上传时,用的哪个版本的IE,为了更好的沟通,请加入fastupload community,群号:210-759-641,加入时请注明“fastupload开源爱好者”字样
从表单里上传了本地的C:\upload.txt文件,其对应的文件名则是upload.txt
传上去的名字就是一个C
估计是取了C:\upload.txt的第一个字吧
求指教
传上去的名字就是一个C
估计是取了C:\upload.txt的第一个字吧
求指教
@RequestMapping(value = "/uploadFile/sid/{sid}/flagTemp/{flagTemp}/", method = RequestMethod.POST) public ModelAndView uploadFile(@PathVariable String sid, @PathVariable String flagTemp, HttpServletRequest request, HttpServletResponse response) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); MultiPartDataFactory mpdf = new MemoryMultiPartDataFactory("utf-8"); HttpMemoryUploadParser httpMemoryUploadParser = new HttpMemoryUploadParser(request, mpdf); long s = System.currentTimeMillis(); List<MultiPartData> fileList = httpMemoryUploadParser.parseList(); return null; }
请问这里获得的fileList size为0是怎么回事?我前台用的是最普通的form表单提交,设置的enctype="multipart/form-data",用的是spring3
发表评论
-
Fastupload 0.6.1 发布
2014-03-03 09:44 15210.6.1版本主要修复了JQuery-form提交ajax请 ... -
fastupload 0.6.0发布
2013-06-23 18:24 1716Fastupload 0.6.0完善或者新增加的功能有: ... -
uProfiler使用指南
2013-06-13 14:43 1502简介: uProfiler Community是面向主题 ... -
uProfiler Community 1.0发布
2013-06-08 09:39 1947uProfiler Community 1.0是面 ... -
fastupload-springmvc 0.5.5发布
2013-04-15 21:55 1951fastupload-springmvc是利用f ... -
Fastupload 0.5.3发布
2013-01-05 19:55 953相对于以往的版本,fastupload 0.5.3做出了明 ... -
fastupload已发布至maven中心库
2012-11-29 09:44 989为了让大家更方便的使用fastupload开源项目,fastu ... -
白话MVC(五)初窥Spring MVC
2012-11-22 21:17 2157在 为 struts2 项 目写完 fastuplo ... -
Fastupload 0.4.7发布,支持struts2
2012-10-28 20:56 1722Fastupload 0.4.7这个版本中主要增加了支持str ... -
白话MVC(四)为Struts2编写文件上传插件
2012-10-28 20:47 3119Struts2中,在Dispatcher.java ... -
Fastupload 0.4.2发布
2012-10-19 12:05 1500更新:fastupload 0.4.2支 ... -
fastupload召集开源开发志愿者
2012-10-11 19:57 98fastupload开源项目自发布0.3.5版本后,文件上传的 ... -
白话MVC(三)Struts2拦截器巧妙装配Model Bean
2012-10-12 18:02 1980白话MVC(二) 在Struts的过滤器中,经过调用Prep ... -
白话MVC(二)Struts2中Model的处理基础-ActionContext
2012-10-09 13:17 2395白话MVC(一) ... -
白话MVC(一)Model的产生及处理
2012-09-29 00:36 34545白话MVC(二) 最近在带一“徒弟”,领悟能力很高,对我 ... -
文件上传的秘密(五)0.31版本功能基本完备
2012-08-26 21:15 1342fastupload 0.31版本上周已经发布,因为工作的关系 ... -
fastupload 0.3.1发布
2012-08-21 15:25 1686fastupload根据RFC 1867文档 ... -
开源项目fastupload 0.2.3发布
2012-07-06 17:19 1935fastupload 0.2.3发布,增加了对sub-boun ... -
文件上传的秘密(四)大小限制与进度
2012-05-28 14:27 8352RFC1867规范中,对表单上传文件的大小和进度都没有作出规定 ... -
文件上传的秘密(三)性能和稳定性上的衡量
2012-05-19 22:42 2871文件上传的秘密系列之一, http://mojarra.ite ...
相关推荐
《Unity3D平台AR与VR开发快速上手》针对没有编程经验的初学者,通过详细的讲解,《Unity3D平台AR与VR开发快速上手》将Unity3D开发增强现实和虚拟现实的方法介绍给读者,《Unity3D平台AR与VR开发快速上手》使读者能够...
介绍手机modem协议开发主要信令流程,高通/MTK modem协议相关技术,项目实战快速上手。
React快速上手开发 作 者 :(保)斯托扬·斯特凡诺夫(Stoyan Stefanov) 出版发行 : 北京:人民邮电出版社 , 2017.02 ISBN号 :978-7-115-44773-9 页 数 : 188 丛书名 : 图灵程序设计丛书 原书定价 : 49.00 主题...
React快速上手开发高清版+源码,引导快速上手。迅速建立富Web应用,构建组件并将其组织成可维护的大型应用程序。
51单片机开发的简单例程,配有keil C51的源程序
siebel 开发快速上手。 基于亚信在北京移动用siebel进行CRM实施的经验。作者有5年siebel开发经验。
Unity3D是一款跨平台3D、2D游戏及互动...并深入介绍AR(增强现实)、VR(虚拟现实)开发方法,以及地图定位、摄像机、声音播放等开发技巧,让读者了解到如何使用Unity3D制作AR\VR产品,快速进入Unity3D应用开发之门。
C#.Net Abp手撸开发框架 简单明了、快速上手、快速开发 C#.Net Abp手撸开发框架 简单明了、快速上手、快速开发 C#.Net Abp手撸开发框架 简单明了、快速上手、快速开发
STM32嵌入式微控制器快速上手.pdf。深入浅出的讲解stm32的开发,是入门学习者的一个不错选择。
react快速上手开发完整版.pdf
iphone SDK 3 开发快速上手 中文 本书基于iphone sdk 3,介绍用来创建iphone应用程序的工具。从最常用的任务和UI元素开始,讲解如何使用标签页和表格、文件和网络、单多触点显示,..............
Python游戏编程快速上手(pdf+源码).zip
Windows Phone 8 开发快速上手指南,压缩包内有19个章节。
本文档主要讲述了蜂鸟 E203 快速上手说明,有助于新手快速入门
iOS 8应用开发实战——205个快速上手的开发技巧源代码,浓浓的源代码而已,至于书还是看纸质的好,推荐购买。
Java基础教程:PPT格式,生动讲解Java的基础知识,帮助初学者快速上手。
学习python的一个pdf书籍,编程快速上手
【python编程快速上手-让繁琐的工作自动化】项目练习资料
资源名称:一周快速上手iPhone开发视频教程资源目录:【】一周快速上手iPhone开发01【】一周快速上手iPhone开发02【】一周快速上手iPhone开发03【】一周快速上手iPhone开发04【】一周快速上手iPhone开发05【】一周...
快速上手Ionic3 多平台开发企业级问答社区.txt