没有合适的资源?快使用搜索试试~ 我知道了~
首页org.apache.commons.fileupload.DiskFileUpload使用上
org.apache.commons.fileupload.DiskFileUpload使用上

org.apache.commons.fileupload.DiskFileUpload
资源详情
资源评论
资源推荐

org.apache.commons.leupload.DiskFileUpload 使用上
1.setSizeMax 方法
setSizeMax 方法用于设置请求消息实体内容的最大允许大小,以防止客户端故意通过上
传特大的文件来塞满服务器端的存储空间,单位为字节。
2.setSizeThreshold 方法
Apache 文件上传组件在解析和处理上传数据中的每个字段内容时,需要临时保存解析出
的数据。因为 Java 虚拟机默认可以使用的内存空间是有
限的(笔者测试不大于 100M),超出限制时将会发生“java.lang.OutOfMemoryError”
错误,如果上传的文件很大,例如上传 800M 的文件,在
内存中将无法保存该文件内容,Apache 文件上传组件将用临时文件来保存这些数据;但
如果上传的文件很小,例如上传 600 个字节的文件,显然
将其直接保存在内存中更加有效。setSizeThreshold 方法用于设置是否使用临时文件保
存解析出的数据的那个临界值,该方法传入的参数的单。
3. setRepositoryPath 方法
setRepositoryPath 方法用于设置 setSizeThreshold 方法中提到的临时文件的存放目录,
这里要求使用绝对路径。其完整语法定义如下:
public void setRepositoryPath(String repositoryPath)
如果不设置存放路径,那么临时文件将被储存在"java.io.tmpdir"这个 JVM 环境属性所指
定的目录中,tomcat 5.5.9 将这个属性设置为了
“<tomcat 安装目录>/temp/”目录。
4. parseRequest 方法
parseRequest 方法是 DiskFileUpload 类的重要方法,它是对 HTTP 请求消息进行解析
的入口方法,如果请求消息中的实体内容的类型不是
“multipart/form-data”,该方法将抛出 FileUploadException 异常。parseRequest
方法解析出 FORM 表单中的每个字段的数据,并将它们分别
包装成独立的 FileItem 对象,然后将这些 FileItem 对象加入进一个 List 类型的集合对象
中返回。parseRequest 方法的完整语法定义如下:
public List parseRequest(HttpServletRequest req)
parseRequest 方法还有一个重载方法,该方法集中处理上述所有方法的功能,其完整语
法定义如下:
parseRequest(HttpServletRequest req,int sizeThreshold,long sizeMax,
String path)
这两个 parseRequest 方法都会抛出 FileUploadException 异常。
5. isMultipartContent 方法
isMultipartContent 方法方法用于判断请求消息中的内容是否是“multipart/form-data”
类型,是则返回 true,否则返回 false。

isMultipartContent 方法是一个静态方法,不用创建 DiskFileUpload 类的实例对象即可
被调用,其完整语法定义如下:
public static @nal boolean isMultipartContent(HttpServletRequest req)
6. setHeaderEncoding 方法
由于浏览器在提交 FORM 表单时,会将普通表单中填写的文本内容传递给服务器,对于文
件上传字段,除了传递原始的文件内容外,还要传递其
文件路径名等信息,如后面的图 1.3 所示。不管 FORM 表单采用的是“application/x-
www-form-urlencoded”编码,还是“multipart/form-data
”编码,它们仅仅是将各个 FORM 表单字段元素内容组织到一起的一种格式,而这些内容
又是由某种字符集编码来表示的。关于浏览器采用何种
字符集来编码 FORM 表单字段中的内容,请参看笔者编著的《深入体验 java Web 开发内
幕——核心基础》一书中的第 6.9.2 的讲解,
“multipart/form-data”类型的表单为表单字段内容选择字符集编码的原理和方式与
“application/x-www-form-urlencoded”类型的表单是
相同的。FORM 表单中填写的文本内容和文件上传字段中的文件路径名在内存中就是它们
的某种字符集编码的字节数组形式,Apache 文件上传组
件在读取这些内容时,必须知道它们所采用的字符集编码,才能将它们转换成正确的字符
文本返回。
对于浏览器上传给 WEB 服务器的各个表单字段的描述头内容,Apache 文件上传组件都
需要将它们转换成字符串形式返回,setHeaderEncoding 方
法用于设置转换时所使用的字符集编码,其原理与笔者编著的《深入体验 java Web 开发
内幕——核心基础》一书中的第 6.9.4 节讲解的
ServletRequest.setCharacterEncoding 方法相同。setHeaderEncoding 方法的完整
语法定义如下:
public void setHeaderEncoding(String encoding)
其中,encoding 参数用于指定将各个表单字段的描述头内容转换成字符串时所使用的字
符集编码。
注意:如果读者在使用 Apache 文件上传组件时遇到了中文字符的乱码问题,一般都是没
有正确调用 setHeaderEncoding 方法的原因。
1.2.3 FileItem 类
FileItem 类用来封装单个表单字段元素的数据,一个表单字段元素对应一个 FileItem 对
象,通过调用 FileItem 对象的方法可以获得相关表单字
段元素的数据。FileItem 是一个接口,在应用程序中使用的实际上是该接口一个实现类,
该实现类的名称并不重要,程序可以采用 FileItem 接

口类型来对它进行引用和访问,为了便于讲解,这里将 FileItem 实现类称之为 FileItem
类。FileItem 类还实现了 Serializable 接口,以支持序
列化操作。
对于“multipart/form-data”类型的 FORM 表单,浏览器上传的实体内容中的每个表单字
段元素的数据之间用字段分隔界线进行分割,两个分隔
界线间的内容称为一个分区,每个分区中的内容可以被看作两部分,一部分是对表单字段
元素进行描述的描述头,另外一部是表单字段元素的
主体内容,如图 1.3 所示。
图 1.3
主体部分有两种可能性,要么是用户填写的表单内容,要么是文件内容。FileItem 类对象
实际上就是对图 1.3 中的一个分区的数据进行封装的对
象,它内部用了两个成员变量来分别存储描述头和主体内容,其中保存主体内容的变量是
一个输出流类型的对象。当主体内容的大小小于
DiskFileUpload.setSizeThreshold 方法设置的临界值大小时,这个流对象关联到一片内
存,主体内容将会被保存在内存中。当主体内容的数据
超过 DiskFileUpload.setSizeThreshold 方法设置的临界值大小时,这个流对象关联到
硬盘上的一个临时文件,主体内容将被保存到该临时文件
中。临时文件的存储目录由 DiskFileUpload.setRepositoryPath 方法设置,临时文件名
的格式为“upload_00000005(八位或八位以上的数字)
.tmp”这种形式,FileItem 类内部提供了维护临时文件名中的数值不重复的机制,以保证
了临时文件名的唯一性。当应用程序将主体内容保存
到一个指定的文件中时,或者在 FileItem 对象被垃圾回收器回收时,或者 Java 虚拟机结
束时,Apache 文件上传组件都会尝试删除临时文件,以
尽量保证临时文件能被及时清除。
下面介绍 FileItem 类中的几个常用的方法:
1. isFormField 方法
isFormField 方法用于判断 FileItem 类对象封装的数据是否属于一个普通表单字段,还是
属于一个文件表单字段,如果是普通表单字段则返回
true,否则返回 false。该方法的完整语法定义如下:
public boolean isFormField()
2. getName 方法
getName 方法用于获得文件上传字段中的文件名,对于图 1.3 中的第三个分区所示的描
剩余13页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论14