File,DiskFileItemFactory,ServletFileUpload,FileItem 文件上传类
文件上传组件中,如果对File,DiskFileItemFactory ,ServletFileUpload ,FileItem这四个类理解了,也就理解了文件上传组件。
java.io.File类
File(File parent,String child)根据parent的抽象路径名和child的路径名,创建一个File实例。
File(String pathname)通过将给定的路径名字符串转换成抽象路径名来创建一个File实例。
File(String parent,String child)根据patent的路径名字符串和child字符串来创建一个File实例。
DiskFileItemFactory类
将请求消息中的每一个项目封装成单独的DiskFileItem(FileItem接口的具体实现)的工作,由 org.apache.commons.fileupload.disk.DiskFileItemFactory(org.apache.commons.fileupload.FileItemFactory 接口的具体实现)来完成。当上传的文件较小的时候自己存在内存中,比较大时,就保存到磁盘的临时文件夹。
DiskFileItemFactory的属性中,public static int DEFAULT_SIZE_THRESHOD:将文件保存在内存还是临时文件件的默认临界值,默认值是10240,10K。private File repository:用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir获取。如下代码:
System.getProperty("java.io.tmpdir");private int sizeThreshod:用于保存将文件保存在内存还是临时文件夹的临界值。
构造方法:public DiskFileItemFactory()采用默认临界值和系统临时文件夹来磁盘文件项目工厂;
public DiskFileItemFactory(int sizeThrehold,File repository)采用sizeThrehold为临界值, repository作为临时文件夹来创建磁盘文件项目工厂。
方法:FileItem createItem()根据DiskFileItemFactory的相关配置将每一个请求消息实体项目创建成
FileItem实例并返回。该方法从来不需要我们亲自调用,fileupload在解析时自动调用。
void setSizeThrehold(int sizeThrehold)Apache上传组件在解析上传数据的每个字段内容的时候, 需要临时保存解析出来的数据,以便后面进一步的处理。因为Java虚拟机默认的可以使用的内存空间上 有限的,超出限制时会抛出“java.lang.OutOfMemoryError”的错误。如果上 传的文件很大,在内存 中将无法临时保存该文件的内容,Apache上传组件转而采用临时 文件夹来保存该文件的内容。此方法 设置将文件存放在内存还是临时文件夹的临界值。
void setRepository(File respository)此方法设置当文件的大小超出sizeThrehold临界值时,将文件以临时文件保存在磁盘上的存放目录。有一个对应的获得临时文件夹的方法File getRespository()。没有调用该方法,Tomcat默认的临时目录为“tomcat/temp/”。
ServletFileUpload类
org.apache.commons.fileupload.servlet.ServletFileUpload类似apache文件上传组件处理文 件上传的核心高级类,使用其parseRequest(HttpServletRequest)方法可以将表单提交的数据封装成FileItem类,然后 以List的形式返回。如果你希望进一步提高性能,可以使用getItemIterator方法,直接获得每一文件项的数据输入流,对数据进行直接处理。 在使用ServletFileUpload对象解析请求时,需要根据DIskFileItemFactory的属性sizeThrehold ,Respository来决定解析得到的数据是保存在内存还是某个临时目录中。所以,我们要做解析前,构造好DiskFileItemFactory对 象。通过ServletFileUpload的构造方法,或者setFileItemFactory()方法设置ServletFileUpload对象 的fileItemFactory属性
构造方法:public ServletFileUpload(),构造一个未初始化的实例,需要在解析请求之前调用setFileItemFacotry方法,设置fileItemFactory属性。
public ServletFileUpload(FileItemFactory fileItemFactory)构造一个实例并根据指定的 FileItemFactory对象设置fileItemFactory属性。
常用方法:1.public void setSizeMax(long sizeMax)。该方法继承FileUploadBase类,用于设置请求消息实体内容(所有上传的数据)的最大尺寸限制,防止客户端恶意上传大文件浪 费服务器的存储空间。在请求解析的过程中,如果请求消息体的内容超过了setSizeMax方法设置值,将会抛出FileUploadBase内部定义的 SizeLimitExceededException(FileUploadException的子类)。该方法有一个对应的读方法:public long getSizeMax()。
2.public void setFileSizeMax(long fileSizeMax),该方法继承自FileUploadBase类,用来设置单个上传文件的最大尺寸。该方法有一个对应的读方法 public long getFileSizeMax()。在请求解析的过程中,如果单个文件上传的大小超过了setFileSizeMax的设置值,将会抛出 FileUploadBase内部定义的FileSizeLimitExceededException
(FileUploadException异常的子类)异常。
3.public List parseRequest(javax.servlet.http.HttpServletRequest request)。parseRequest是ServletFileUpload类的主要方法,它是对Http请求消息体内容进行解析的入口方法。它 解析出Form表单中的每一个字段的数据,并将它们分别包装成独立的FileItem对象,然后将这些对象装入一个List类型的集合对象返回。该方法抛 出
FileUploadException异常类处理诸如文件尺寸过大,请求消息中的实体内容不是“multipart/form-data”,IO异常,请求消息体长度信息丢失等异常。这些异常都是FileUploadException的一个子类。
4.public FileItemIterator getItemIterator(HttpServletRequest request)。getItemIterator方法和
parseRequest 方法基本相同。但是getItemIterator方法返回的是一个迭代器,该迭代器里面保存的不是FileItem对象,而是 FileItemStream对象,如果你希望进一步提高性能,你可以是使用该方法,直接获得每一个文件项的数据输入流,做底层处理。如果性能不是问题, 你可以用parseRequest方法。
5.public static boolean isMultipartContent(HttpServletRequest request)。方法的用法和作用如名字所表示的。
6.getFileItemFactory()和setFileItemFactory(FileItemFactory fileItemFactory)方法继承值
FileUpload类,用于设置和读取fileItemFactory属性。
7.public void setProgressListener(ProgressListener pListener)。设置文件上传进度监听器,该方法有一个对应的读取方法ProgressListener getProgressListener()。
8.public void setHeaderEncoding()。在文件上传请求的消息体中,除了普通表单域的值是文本内容外,文件上传字段中的文件路径也是文本内容,在内存中 保存的是它们的某种字符编码的字节数组。Apache上传组件中读取这些内容时,必须知道他们采用的字符集编码,才能将它们转换成正确的字符文本返回。 setHeaderEncoding 继承自FileUploadBase类,用来设置上面的内容的字符编码。如果没有设置则,对应读方法
getHeaderEncoding() 得到的是null,将采用HttpServletRequest设置的字符编码。如果HttpServletRequest的字符编码也为null ,则采用系统默认编码。可以通过System.getProperty(“file.encoding”)获得系统默认字符编码。