`
Mojarra
  • 浏览: 130772 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

fastupload API开发快速上手

 
阅读更多

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,表示当前对象中不包含任何数据

[暂时写这么多,欢迎大家提意见,我会继续完善]

分享到:
评论
7 楼 Mojarra 2012-11-11  
searchjack 写道
,,,\\  楼主, 求 demo .


请下载最新的版本,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);

	}
}

6 楼 searchjack 2012-11-10  
,,,\\  楼主, 求 demo .
5 楼 Mojarra 2012-10-14  
camero 写道
Mojarra 写道
在rfc 1867规范中,对于Multipart/form-data请求,每个分割header中的文件名是不会包含有路径的。
从表单里上传了本地的C:\upload.txt文件,其对应的文件名则是upload.txt

camero 写道
貌似获取的附件名称不对
传上去的名字就是一个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开源爱好者”字样
4 楼 Mojarra 2012-10-12  
在rfc 1867规范中,对于Multipart/form-data请求,每个分割header中的文件名是不会包含有路径的。
从表单里上传了本地的C:\upload.txt文件,其对应的文件名则是upload.txt

camero 写道
貌似获取的附件名称不对
传上去的名字就是一个C
估计是取了C:\upload.txt的第一个字吧
求指教

3 楼 camero 2012-10-12  
貌似获取的附件名称不对
传上去的名字就是一个C
估计是取了C:\upload.txt的第一个字吧
求指教
2 楼 Mojarra 2012-09-29  
@xiahyoha,请使用最新的0.3.5版本,对于不能解析文件的情况,可以先debug看request的ServletInputStream能否读取到数据,
1 楼 xiahyoha 2012-09-11  
@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

相关推荐

    Unity3D平台AR与VR开发快速上手.epub

    《Unity3D平台AR与VR开发快速上手》针对没有编程经验的初学者,通过详细的讲解,《Unity3D平台AR与VR开发快速上手》将Unity3D开发增强现实和虚拟现实的方法介绍给读者,《Unity3D平台AR与VR开发快速上手》使读者能够...

    基于Python的FastAPI框架快速上手与API交互文档教程源码

    本项目为基于Python的FastAPI框架快速入门教程及API交互文档源码,包含53个文件,涵盖17个...教程全面介绍FastAPI框架,引导开发者快速上手,并通过API交互文档详细解析核心模块应用。视频教程同步提供,助力高效学习。

    react快速上手开发.zip

    React快速上手开发 作 者 :(保)斯托扬·斯特凡诺夫(Stoyan Stefanov) 出版发行 : 北京:人民邮电出版社 , 2017.02 ISBN号 :978-7-115-44773-9 页 数 : 188 丛书名 : 图灵程序设计丛书 原书定价 : 49.00 主题...

    Unity3D平台AR与VR开发快速上手.rar

    Unity3D是一款跨平台3D、2D游戏及互动...并深入介绍AR(增强现实)、VR(虚拟现实)开发方法,以及地图定位、摄像机、声音播放等开发技巧,让读者了解到如何使用Unity3D制作AR\VR产品,快速进入Unity3D应用开发之门。

    STM32嵌入式微控制器快速上手

    "STM32嵌入式微控制器快速上手" 是一本旨在帮助初学者快速掌握STM32开发的教程,它通过深入浅出的方式,引导读者理解和应用STM32的相关技术。 首先,STM32微控制器的特点在于其强大的处理能力、丰富的外设接口和低...

    Python游戏编程快速上手(pdf+源码).zip

    《Python游戏编程快速上手》是一本面向初学者的编程教程,主要讲解如何利用Python语言进行游戏开发。这本书结合了理论知识与实践项目,旨在帮助读者迅速掌握Python的基础语法,并进一步提升到能够独立编写游戏的水平...

    iphone SDK 3 开发快速上手 中文

    iphone SDK 3 开发快速上手 中文 本书基于iphone sdk 3,介绍用来创建iphone应用程序的工具。从最常用的任务和UI元素开始,讲解如何使用标签页和表格、文件和网络、单多触点显示,..............

    OKUMA DevelopKit_Ver2.0 API开发包及操作说明.zip

    4. **示例代码**:为了帮助开发者快速上手,开发包通常会包含一些示例代码,这些示例展示了如何使用API进行基本操作,如启动和停止机床、读取机床状态等。 5. **文档说明**:配套的操作说明文档将详细介绍每个API的...

    蜂鸟 E203 快速上手说明

    本文档主要讲述了蜂鸟 E203 快速上手说明,有助于新手快速入门

    vmware接口API开发文档1

    本书是一个详细的开发指南,旨在帮助开发者快速上手使用 VMware vSphere Web Services SDK 4.1。该书涵盖了从设置开发环境到构建应用程序的所有方面,并提供了详细的编程示例和调试技巧。 vSphere Web Services SDK...

    C#.Net Abp手撸开发框架 简单明了、快速上手、快速开发

    9. **快速开发工具**:ABP提供了许多开发工具和模板,如Visual Studio扩展、Entity Framework集成等,使得开发者能够更快地上手和开发项目。 10. **文档和社区支持**:ABP有一个活跃的开发者社区,提供丰富的文档和...

    若依框架前后端分离版 快速上手 前端(vue)版

    【标题】:“若依框架前后端分离版 快速上手 前端(vue)版” 【描述】:这个教程主要关注的是若依框架在前后端分离模式下的前端实现,采用Vue.js作为主要开发工具。它旨在帮助开发者快速理解和应用若依框架,通过...

    一周快速上手iPhone开发视频教程

    资源名称:一周快速上手iPhone开发视频教程资源目录:【】一周快速上手iPhone开发01【】一周快速上手iPhone开发02【】一周快速上手iPhone开发03【】一周快速上手iPhone开发04【】一周快速上手iPhone开发05【】一周...

    Python编程快速上手 让繁琐工作自动化 (源码)

    "Python编程快速上手 让繁琐工作自动化"是一本旨在帮助初学者掌握Python编程,并利用其进行自动化任务处理的教程。源码是学习编程的重要组成部分,它使读者能够直观地看到代码的运行效果,加深理解并动手实践。 在...

    PHY6220快速上手手册.pdf

    PHY6220快速上手手册是基于PHY6220低功耗蓝牙芯片的物联网应用开发板的使用手册,该手册旨在指导开发者快速搭建开发环境、编译和烧录SDK、进行基本调试等操作。 开发环境搭建 PHY6220 EVB开发板资源包括Type-C接口...

    EB工具快速上手指南.pdf

    本文介绍了使用 EB tresos Studio 23.0.0(以下如有用到均简称为“EB” )和 MCAL 软件...及配置代码的生成等内容, 旨在帮助未使用过 EB 工具的工程师快速上手使用 EB 工具。本文档是基于NXP(恩智浦)的MCAL来讲解的。

    React快速上手开发

    React快速上手开发

    《Unity3D平台AR开发快速上手--基于EasyAR4.0》随书资源和相关说明-附件资源

    《Unity3D平台AR开发快速上手--基于EasyAR4.0》随书资源和相关说明-附件资源

Global site tag (gtag.js) - Google Analytics