论坛首页 Java企业应用论坛

fastupload API开发快速上手

浏览 2116 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-09-01   最后修改:2012-09-01

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

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

   发表时间:2012-09-03  
fastupload是什么来历?有什么优点
0 请登录后投票
   发表时间:2012-09-03  
可以看一下这个博客, http://mojarra.iteye.com/blog/1663238
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics