一书中的第 6.9.4 节讲解的ServletRequest.setCharacterEncoding 方法相同。
setHeaderEncoding 方法的完整语法定义如下:public void setHeaderEncodingString 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 isFormField2. getName 方法 对于图 1.3 中的第三个分区所示的描述头,getName 方法用于获得文件上传字段中的文件名,getName 方法返回的结果为字符串“C:bg.gif”。
如果 FileItem 类对象对应的是普通表单字段,getName 方法将返回 null。
即使用户没有通过网页表单中的文件字段传递任何文件,但只要设置了文件表单字段的 name 属性,浏览器也会将文件字段的信息传递给服务器,只是文件名和文件内容部分都为空,但这个表单字段仍然对应一个FileItem 对象,此时,getName 方法返回结果为空字符串quotquot,读者在调用 Apache 文件上传组件时要注意考虑这个情况。
getName 方法的完整语法定义如下:public String getName注意:如果用户使用 Windows 系统上传文件,浏览器将传递该文件的完整路径,如果用户使用 Linux 或者 Unix 系统上传文件,浏览器将只传递该文件的名称部分。
3.getFieldName 方法getFieldName 方法用于返回表单字段元素的 name 属性值,也就是返回图 1.3 中的各个描述头部分中的 name 属性值,例如“namep1”中的“p1”。
getFieldName 方法的完整语法定义如下:public String getFieldName4. write 方法write 方法用于将 FileItem 对象中保存的主体内容保存到某个指定的文件中。
如果 FileItem 对象中的主体内容是保存在某个临时文件中