Apache Commons FileUpload
应用指南
前言
几乎每一个Web应用中都需要为用户提供文件上传的功能,例如,QQ空间、各种博客的相册、论坛的附件、个人头像等。对文件上传功能,在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可;但在Web服务器端获取通过浏览器上传的文件数据(二进制输入流),需要进行复杂的编程处理。为了简化文件上传的的处理,一些公司和组织专门开发了文件上传组件。其中,Apache文件上传组件得到了广泛的传播和应用。我们将详细介绍如何使用Apache文件上传组件进行文件上传实现。
1 获取上传组件
使用Apache Commons Fileupload 文件上传组件需要两个类库文件:
1) commons-fileupload-1.2.2.jar
2) commons-io-1.4.jar
第一步:下载commons-fileupload-1.2.2.jar。
在浏览器中输入/fileupload/ 打开Apache Commons Fileupload 文件上传组件主页面,在 Downloading 栏目中点击任意一个版本号后面的“here”超级链接,可以打开当前最新版本的 Apache Commons Fileupload 文件上传组件下载页面,(2010-08-28为止的可下载最新版本是1.2.2版)。也可以直接输入/fileupload/i 打开最新版本下载页面。
主页面
当前最新版本的下载页面
在当前最新版本的下载页面,提供二进制可执行版本(Binares)和源程序版本(Source)两种文件的下载,每一种文件都有两种压缩格式:
1) .zip,适用windows 操作系统
2) .,适用 linux 和 unix 操作系统
我们这里选择下载 commons-fileupload-1.2.2-bin.zip 文件。解压后得到如下目录结构:
commons-fileupload-1.2.2 (根目录)
-----lib (类库目录)
----- commons-fileupload-1.2.2.jar (我们要用的二进制类库)
-----site (包括Apache Commons Fileupload 组件站点所有页面文件)
----- apidocs (API文档目录,API文档链接可以在下面的首页中到,也可以直接打开此目录,点击index.html打开API文档)
----- index.html(站点首页)
第二步:下载commons-io-1.4.jar。
在浏览器中输入/io/ 打开 Apache Commons IO 的主页,点击左侧菜单选项中的 Download 超级链接,打开当前最新版本下载页面(/io/i),选择下载 commons-io-1.4-bin.zip 文件,解压缩在根目录中即可得到 commons-io-1.4.jar 。
到这里,我们就准备好了文件上传所需要的需要类库文件了。
2 FileUpload如何工作?
在最初的 http 协议中,没有上传文件方面的功能。RFC1867("Form-based File Upload in HTML".)为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。
2.1客户端
简单来说,RFC1867规范要求http协议增加了file类型的input标签,用于浏览需要上传的文件。同时要求FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可,下面是我们文件上传页面的表单代码:
<form action="<%=ContextPath()%>/servlet/SimpleUpload" enctype="multipart/form-data" method="post">
文本1:<input type="text" name="text1" value="文本1"><br>
文件2:<input type="text" name="text2" value="文本2"><br>
文件1:<input type="file" name="file1"><br>
文件2:<input type="file" name="file2"><br>
文件2:<input type=inputtypefile不上传文件"file" name="file3"><br>
<input type="submit" value="开始上传">
</form>
2.2 服务器端
一个文件上传请求的消息实体由一系列根据 RFC1867("Form-based File Upload in HTML".)编码的项目(文本参数和文件参数)组成。自己编程来解析获取这些数据是非常麻烦的,还需要了解RFC1867规范对请求数据编码的相关知识。FileUpload 可以帮助我们解析这样的请求,将每一个项目封装成一个实现了FileItem接口的对象,并以列表的形式返回。所以,我们只需要了解FileUpload的API如何使用即可,不用管它们的底层实现。让我们来看
一个简单文件上传处理代码:
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload uploader = new ServletFileUpload(factory);
List<FileItem> list = uploader.parseRequest(request);
if (item.isFormField()){
// 处理普通表单域
String field = FieldName();//表单域名
String value = String("GBK");
} else {
//将临时文件保存到指定目录
String fileName = Name();//文件名称
String filepath = "您希望保存的目录/" + fileName;
item.write(new File(filepath));//执行保存
}
怎么样?简单吧!下面我们来继续了解一些必须了解的API。
FileItem接口
org.apachemons.fileupload.disk.DiskFileItem实现了FileItem接口,用来封装单个表单字段元素的数据。通过调用FileItem 定义的方法可以获得相关表单字段元素的数据。我们不需要关心DiskFileItem的具体实现,在程序中可以采用FileItem接口类型来对DiskFileItem对象进行引用和访问。FileItem类还实现了Serializable接口,以支持序列化操作。
下图是一个文件上传表单:
上图表单提交的http数据包的内容:
POST /demo/servlet/SimpleUpload HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Referer: 127.0.0.1:8080/demo/simpleUpload.jsp
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7da1772c5504c6
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
Host: 127.0.0.1:8080
Content-Length: 184423
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=BD8E58E5BAD9B559C0262077FB5E0B4E
-----------------------------7da1772c5504c6
Content-Disposition: form-data; name="text1"
郑州蜂鸟科技有限公司
-----------------------------7da1772c5504c6
Content-Disposition: form-data; name="text2"
申林
-----------------------------7da1772c5504c6
Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\All Users\Documents\My Pictures\示例图片\Blue hills.jpg"
Content-Type: image/pjpeg
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论