File,DiskFileItemFactory,ServletFileUpload

来源:互联网 发布:sm4密码算法.pdf 编辑:程序博客网 时间:2024/05/22 05:25

导读:文件上传组件中,如果对File,DiskFileItemFactory ,ServletFileUpload ,FileItem这四个类理解了,也就理解了文件上传组件。

1.java.io.File类

  • File(File parent,String child)根据parent的抽象路径名和child的路径名,创建一个File实例。
  •  File(String pathname)通过将给定的路径名字符串转换成抽象路径名来创建一个File实例。
  •  File(String parent,String child)根据patent的路径名字符串和child字符串来创建一个File实例。

2.DiskFileItemFactory类

 将请求消息中的每一个项目封装成单独的DiskFileItem(FileItem接口的具体实现)的工作,由org.apache.commons.fileupload.disk.DiskFileItemFactory(org.apache.commons.fileupload.FileItemFactory接口的具体实现)来完成。当上传的文件较小的时候自己存在内存中,比较大时,就保存到磁盘的临时文件夹

  DiskFileItemFactory的属性中,public static intDEFAULT_SIZE_THRESHOD:将文件保存在内存还是临时文件件的默认临界值,默认值是10240,10K。

  private Filerepository用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir获取。如下代码:System.getProperty("java.io.tmpdir");

  private intsizeThreshod:用于保存将文件保存在内存还是临时文件夹的临界值。

构造方法: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上传组件转而采用临时文件夹来保存该文件的内容。此方法设置将文件存放在内存还是临时文件夹的临界值。

            voidsetRepository(File respository)此方法设置当文件的大小超出sizeThrehold临界值时,将文件临时文件保存在磁盘上的存放目录有一个对应的获得临时文件夹的方法File getRespository()。没有调用该方法,Tomcat默认的临时目录为“tomcat/temp/”。                         

3.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”)获得系统默认字符编码。


原创粉丝点击