文件上传组件ApacheCommonsFileUpload应用指南.docx
- 文档编号:2296830
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:16
- 大小:246.49KB
文件上传组件ApacheCommonsFileUpload应用指南.docx
《文件上传组件ApacheCommonsFileUpload应用指南.docx》由会员分享,可在线阅读,更多相关《文件上传组件ApacheCommonsFileUpload应用指南.docx(16页珍藏版)》请在冰豆网上搜索。
文件上传组件ApacheCommonsFileUpload应用指南
文件上传组件_Apache_Commons_FileUpload_应用指南
ApacheCommonsFileUpload
应用指南
前言
几乎每一个Web应用中都需要为用户提供文件上传的功能,例如,QQ空间、各种博客的相册、论坛的附件、个人头像等。
对文件上传功能,在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可;但在Web服务器端获取通过浏览器上传的文件数据(二进制输入流),需要进行复杂的编程处理。
为了简化文件上传的的处理,一些公司和组织专门开发了文件上传组件。
其中,Apache文件上传组件得到了广泛的传播和应用。
我们将详细介绍如何使用Apache文件上传组件进行文件上传实现。
1获取上传组件
使用ApacheCommonsFileupload文件上传组件需要两个类库文件:
1)1.2.2
第一步:
下载1.2.2。
在浏览器中输入打开ApacheCommonsFileupload文件上传组件主页面,在Downloading栏目中点击任意一个版本号后面的“here”超级链接,可以打开当前最新版本的ApacheCommonsFileupload文件上传组件下载页面,(2010-08-28为止的可下载最新版本是1.2.2版)。
也可以直接输入打开最新版本下载页面。
主页面
当前最新版本的下载页面
在当前最新版本的下载页面,提供二进制可执行版本(Binares)和源程序版本(Source)两种文件的下载,每一种文件都有两种压缩格式:
1).zip,适用windows操作系统
2).,适用linux和unix操作系统
我们这里选择下载1.2.2文件。
解压后得到如下目录结构:
commons-fileupload-1.2.2(根目录)
-----lib(类库目录)
-----1.2.2(我们要用的二进制类库)
-----site(包括ApacheCommonsFileupload组件站点所有页面文件)
-----apidocs(API文档目录,API文档链接可以在下面的首页中找到,也可以直接打开此目录,点击打开API文档)
-----(站点首页)
第二步:
下载。
在浏览器中输入打开ApacheCommonsIO的主页,点击左侧菜单选项中的Download超级链接,打开当前最新版本下载页面(),选择下载文件,解压缩在根目录中即可得到。
到这里,我们就准备好了文件上传所需要的需要类库文件了。
2FileUpload如何工作
在最初的http协议中,没有上传文件方面的功能。
RFC1867("Form-basedFileUploadinHTML".)为http协议添加了这个功能。
客户端的浏览器,如MicrosoftIE,Mozila,Opera等,按照此规范将用户指定的文件发送到服务器。
服务器端的网页程序,如php,asp,jsp等,可以按照此规范,解析出用户发送来的文件。
客户端
简单来说,RFC1867规范要求http协议增加了file类型的input标签,用于浏览需要上传的文件。
同时要求FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可,下面是我们文件上传页面的表单代码:
文本1:
文件2:
文件1:
文件2:
文件2:
服务器端
一个文件上传请求的消息实体由一系列根据RFC1867("Form-basedFileUploadinHTML".)编码的项目(文本参数和文件参数)组成。
自己编程来解析获取这些数据是非常麻烦的,还需要了解RFC1867规范对请求数据编码的相关知识。
FileUpload可以帮助我们解析这样的请求,将每一个项目封装成一个实现了FileItem接口的对象,并以列表的形式返回。
所以,我们只需要了解FileUpload的API如何使用即可,不用管它们的底层实现。
让我们来看一个简单文件上传处理代码:
DiskFileItemFactoryfactory=newDiskFileItemFactory();
ServletFileUploaduploader=newServletFileUpload(factory);
List
if()){
1772c5504cETCLR:
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:
\DocumentsandSettings\AllUsers\Documents\MyPictures\示例图片\Blue"
Content-Type:
image/pjpeg
大量二进制数据内容,无法复制…….
-----------------------------7da1772c5504c6
Content-Disposition:
form-data;name="file2";filename="C:
\DocumentsandSettings\AllUsers\Documents\MyPictures\示例图片\"
Content-Type:
image/pjpeg
大量二进制数据内容,无法复制…….
-----------------------------7da1772c5504c6
Content-Disposition:
form-data;name="file3";filename="C:
\DocumentsandSettings\AllUsers\Documents\MyPictures\示例图片\Water"
Content-Type:
image/pjpeg
大量二进制数据内容,无法复制…….
从第一行,也就是请求行,我们可以看出这是一个post请求。
在请求头部部分,我们可以看到这样一个头部信息:
Content-Type:
multipart/form-data;boundary=---------------------------7da1772c5504c6
其中红色部分说明该请求是一个multipart/form-data类型即多媒体类型的请求。
蓝色部分boundary的值定义了一个字段分隔界线。
在消息体部分可以看出每个表单字段元素数据之间采用字段分隔界线进行分割,两个分隔界线间的内容称为一个分区,每个分区中的内容包括两部分,一部分是对表单字段元素进行描述的描述头,另外一部分是表单字段元素的主体内容。
通过对比描述头,我们可以很容易区分文本字段和文件字段。
不管是文件字段还是文本字段,都有name属性,即该字段作为一个表单域的名字。
而文件字段还有filename,即上传文件本身的名字。
另外,还有conten-type属性用于指明文件的类型。
每一个表单字段,不管它是文本还是文件,都被封装成FileItem对象,我们称之为文件项,当文件项数据内容尺寸小于DiskFileItemFactory的sizeThreshold属性设置的临界值时,直接保存在内存中;否则,将数据流以临时文件的形式,保存在DiskFileItemFactory的repository属性指定的临时目录中。
临时文件名形如“upload_00000005(八位或八位以上的数字).tmp”。
FileItem类内部提供了维护临时文件名中的数值不重复的机制,以保证了临时文件名的唯一性。
另外,如何保证临时文件能被及时清除,释放宝贵的系统资源,是非常重要的,我们将在后面讲解。
FileItem类常用的方法:
1.booleanisFormField()方法
isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。
2.StringgetName()方法
getName方法用于获得文件上传字段中的文件名,即表单字段元素描述头中的filename属性值,如“C:
\DocumentsandSettings\AllUsers\Documents\MyPictures\示例图片\”。
如果FileItem类对象对应的是普通表单字段,getName方法将返回null。
即使用户没有通过网页表单中的文件字段传递任何文件,但只要设置了文件表单字段的name属性,浏览器也会将文件字段的信息传递给服务器,只是文件名和文件内容部分都为空,但这个表单字段仍然对应一个FileItem对象,此时,getName方法返回结果为空字符串"",读者在调用Apache文件上传组件时要注意考虑这个情况。
注意:
上面的数据包是通过IE提交,所以是完整的路径和名称。
如C:
\DocumentsandSettings\AllUsers\Documents\MyPictures\示例图片\。
如果是其它浏览器,如火狐和Chromium,则仅仅是名字,没有路径,如。
3.StringgetFieldName()方法
getFieldName方法用于返回表单字段元素描述头的name属性值,也是表单标签name属性的值。
例如“name=file1”中的“file1”。
4.voidwrite(Filefile)方法
write方法用于将FileItem对象中保存的主体内容保存到某个指定的文件中。
如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。
该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。
5.StringgetString()方法
getString
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 上传 组件 ApacheCommonsFileUpload 应用 指南