一) 基础简介:
1、FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的
文件上传功能,与常见的SmartUpload齐名。
2、组件FileUpload依赖于Commons IO组件。 目前FileUpload的最新版本是1.2.2 ,对于此版本官方推荐的依赖的IO组件版本是1.3.2
3、FileUpload 是基于RFC1867协议实现的。
4、API:
http://commons.apache.org/fileupload/apidocs/index.html
二)RFC1867协议:
RFC1867协议作为HTTP协议的附加协议,详细描述了File Upload的规则。RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data,当然还增加了一些与此相关属性。
比如value属性表示默认的上传文件的文件名(无文件上传时生效)
width表示默认的显示文件名的长度
height表示显示上传文件的个数
例子:
<FORM ACTION="http://server.dom/cgi/handle" ENCTYPE="multipart/form-data" METHOD=POST>
What is your name? <INPUT TYPE=TEXT NAME=field1>
What files are you sending? <INPUT TYPE=FILE NAME=pics>
</FORM>
假设用户在name一栏里输入"Joe Blow",上传了一个文件名叫"file1.txt"的文件。那么浏览器将发送的包格式会是这样:
Content-type:
multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"
Joe Blow
--AaB03x
content-disposition: form-data;
name="pics"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
如果上传的文件中还包含一个叫"file2.gif"的图片,那么包格式将会是这样:
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"
Joe Blow
--AaB03x
content-disposition: form-data; name="pics"
Content-type: multipart/mixed, boundary=BbC04y
--BbC04y
Content-disposition: attachment; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--BbC04y
Content-disposition: attachment; filename="file2.gif"
Content-type: image/gif
Content-Transfer-Encoding: binary
...contents of file2.gif...
--BbC04y--
--AaB03x--
总结:
RFC1867对HTTP头作了适当地变更,但变更很小。首先content-type头由以前的:
content-type: application/x-www-form-urlencoded
变为
content-type: multipart/form-data; +空格+ boundary=AaB03x
即增加了boundary,所谓的boundary其实就是分割线,RFC1867利用boundary分割HTTP实体数据。boundary中数字字符区是随机生成的。
三)代码样例:
最简单的一个例子:
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List <FileItem> items = upload.parseRequest(request);
如上我们就把request的所有信息包括上传文件的信息都转换到items这个对象里去了。
再增加一点点控制:
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Sets the size threshold beyond which files are written directly to disk.
factory.setSizeThreshold(yourMaxMemorySize);
// Sets the directory used to temporarily store files that are larger than the configured size threshold.
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Sets the maximum allowed size of a complete request
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List <FileItem> items = upload.parseRequest(request);
FileItem的处理:
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) { // Process a regular form field
String name = item.getFieldName();
String value = item.getString();
} else { // Process a file upload
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
}
}
这里有必要对FileItem的一些方法做进一步的介绍:
public boolean isFormField() -- 用于判断 FileItem 类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段,如果是普通表单字段则返回 true,否则返回 false。
public String getName() -- 依据RFC1867协议返回的是filename的内容。以上文例子为例,返回值将是“file1.txt” 或 “file2.gif”。如果 FileItem 类对象对应的是普通表单字段,getName 方法将返回 null。
public String getFieldName() -- 依据RFC1867协议返回的是name的内容。以上文例子为例,返回值将是“field1” 或 “pics”。
public void write(File file) -- 用于将 FileItem 对象中保存的主体内容保存到某个指定的文件中。如果 FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。
public boolean isInMemory() -- 用来判断 FileItem 类对象封装的主体内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回 true,否则返回false。
public void delete() -- 用来清空 FileItem 类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete 方法将删除该临时文件。
上传文件的保存:
File uploadedFile = new File(...);
item.write(uploadedFile);
四)注意点:
对于fileupload,一共有3种上传文件的处理方式:
DiskFileUpload, ServletFileUpload, PortlerFileUpload
他们的区别是:
ServletFileUpload 最常用的类,大多情况我们就用它了。
DiskFileUpload 已被标记为Deprecated,由ServletFileUpload取代。
PortletFileUpload 需配合portlet的api一起使用(本人至今没用过 = =!)
分享到:
相关推荐
Commons FileUpload 1.3.2. The Apache Commons FileUpload component provides a simple yet flexible means of adding support for multipart file upload functionality to servlets and web applications. ...
Commons FileUpload是Apache组织提供的一款强大的Java文件上传处理组件,常用于Web应用中处理用户通过表单上传的文件。在Web开发中,尤其是在涉及到用户上传照片、文档等大文件时,FileUpload组件提供了方便、高效的...
### Jakarta Commons FileUpload 用户指南知识点总结 #### 一、FileUpload 概览 - **Jakarta Commons FileUpload** 是一个用于处理HTTP文件上传的Java库,它基于**RFC1867**标准来解析和处理文件上传请求。 - **...
1. 添加依赖:在项目中引入Apache Commons IO和FileUpload的JAR文件,或者在Maven或Gradle项目中添加对应的依赖。 2. 创建Servlet或控制器:设置请求的解析器,例如在Servlet中使用`ServletFileUpload`类。 3. ...
《Apache Commons FileUpload组件详解》 Apache Commons FileUpload是一个用于处理HTTP请求中多部分数据的Java库,尤其在上传文件时极为有用。标题中的"commons-fileupload-1.4-bin.zip"表明这是一个包含Apache ...
Apache Struts2 Commons FileUpload反序列化远程代码执行漏洞安全公告 安全公告编号:CNTA-2018-0029 2018年11月7日,国家信息安全漏洞共享平台(CNVD)收录了Apache Struts2 Commons FileUpload反序列化远程代码...
Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传和I/O操作的重要库。这两个库在处理Web应用,特别是基于JSP(JavaServer Pages)的文件上传功能时,扮演着核心角色。在这个主题中,我们将...
Apache Commons FileUpload与Apache Commons IO是Java开发中两个非常重要的库,它们主要用于处理文件上传和I/O操作。这两个库在Web应用、数据处理以及文件管理等领域广泛应用。 Apache Commons FileUpload库是一个...
commons commons-fileupload历史版本jar包集合,包括src源码 附件列表: commons-fileupload-1.0.zip commons-fileupload-1.1.1.zip commons-fileupload-1.1.zip commons-fileupload-1.2.1-bin.zip commons-...
《Apache Commons FileUpload详解》 在Java开发中,处理用户上传文件是一项常见的任务。Apache Commons FileUpload组件就是为了解决这一问题而设计的,它提供了一套完整的解决方案,使得开发者可以方便、高效地处理...
Apache Commons FileUpload jar Apache Commons FileUpload jar Apache Commons FileUpload jar
赠送jar包:commons-fileupload-1.4.jar; 赠送原API文档:commons-fileupload-1.4-javadoc.jar; 赠送源代码:commons-fileupload-1.4-sources.jar; 赠送Maven依赖信息文件:commons-fileupload-1.4.pom; 包含...
### 上传组件Commons fileUpload.jar剖析 #### 一、简介 Apache Commons FileUpload 是一个用于解析`multipart/form-data`编码格式数据的Java库。这种编码格式常用于表单提交时上传文件。FileUpload能够将HTML表单...
Apache Commons FileUpload和Commons IO库为处理文件上传提供了强大的支持。这两个库都是Apache软件基金会开发的开源组件,广泛应用于各种Java项目中。 Apache Commons FileUpload库主要用于处理HTTP协议中的多部分...
开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2...
Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的文件上传功能。这个压缩包包含了从1.0到1.3的所有版本,这是一段跨越时间较长的更新历史,每个版本都可能包含了一些改进、修复和新特性。让我们...
首先,你需要在项目中引入两个JAR包:`commons-fileupload.jar`和`commons-io.jar`。然后,在Servlet中,你可以使用FileUpload类来解析请求并获取上传的文件。以下是一个简单的实现步骤: 1. 创建一个`...
本文将详细介绍`commons-fileupload`库的功能、工作原理以及如何使用。 **一、Apache Commons FileUpload简介** Apache Commons FileUpload是Apache软件基金会的一个开源项目,它提供了处理HTTP多部分/表单数据的...
在Java EE开发中,文件上传是一项常见的功能,Apache Commons FileUpload库正是为了处理这个需求而设计的。这个库提供了一套强大的API,使得在Servlet环境中处理文件上传变得简单且高效。下面将详细介绍Apache ...