ServletFileUpload 类

 

ServletFileUpload 类

 

        org.apache.commons.fileupload.servlet.ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不需要管底层实现,暴露给用户的简单易用的接口)。

        使用其parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。使用该方法处理上传文件简单易用。

        如果你希望进一步提高新能,你可以采用 getItemIterator 方法,直接获得每一个文件项的数据输入流,对数据做直接处理。

        在使用ServletFileUpload对象解析请求时需要根据DiskFileItemFactory对象的属性sizeThreshold(临界值)和repository(临时目录)来决定将解析得到的数据保存在内存还是临时文件中,如果是临时文件,保存在哪个临时目录中?。所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。

ServletFileUpload继承结构:
java.lang.Object

|—org.apache.commons.fileupload.FileUploadBase

     |—org.apache.commons.fileupload.FileUpload

|—org.apache.commons.fileupload.servlet.ServletFileUpload

构造方法:
1) public ServletFileUpload()

     构造一个未初始化的实例,需要在解析请求之前先调用setFileItemFactory()方法设置 fileItemFactory属性。

2) public ServletFileUpload(FileItemFactory fileItemFactory)

     构造一个实例,并根据参数指定的FileItemFactory 对象,设置 fileItemFactory属性。

ServletFileUpload类常用方法:
1)  public void setSizeMax(long sizeMax)
        setSizeMax方法继承自FileUploadBase类,用于设置请求消息实体内容(即所有上传数据)的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。

       在请求解析的过程中,如果请求消息体内容的大小超过了setSizeMax方法的设置值,将会抛出FileUploadBase内部定义的SizeLimitExceededException异常(FileUploadException的子类)。该方法有一个对应的读方法:public long getSizeMax()方法。

2) public void setFileSizeMax(long fileSizeMax)
        setFileSizeMax方法继承自FileUploadBase类,用于设置单个上传文件的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。该方法有一个对应的读方法:public long geFileSizeMax()方法。

       在请求解析的过程中,如果单个上传文件的大小超过了setFileSizeMax方法的设置值,将会抛出FileUploadBase内部定义的FileSizeLimitExceededException异常(FileUploadException的子类)。

3) public List parseRequest(javax.servlet.http.HttpServletRequest req)
        parseRequest 方法是ServletFileUpload类的重要方法,它是对HTTP请求消息体内容进行解析的入口方法。它解析出FORM表单中的每个字段的数据,并将它们分别包装成独立的FileItem对象,然后将这些FileItem对象加入进一个List类型的集合对象中返回。

       该方法抛出FileUploadException异常来处理诸如文件尺寸过大、请求消息中的实体内容的类型不是“multipart/form-data”、IO异常、请求消息体长度信息丢失等各种异常。每一种异常都是FileUploadException的一个子类型。

4)  public FileItemIterator getItemIterator(HttpServletRequest request)
        getItemIterator方法和parseRequest 方法基本相同。但是getItemIterator方法返回的是一个迭代器,该迭代器中保存的不是FileItem对象,而是FileItemStream 对象,如果你希望进一步提高新能,你可以采用getItemIterator方法,直接获得每一个文件项的数据输入流,做底层处理;如果性能不是问题,你希望代码简单,则采用parseRequest方法即可。

5) public stiatc boolean isMultipartContent(HttpServletRequest req)
        isMultipartContent方法方法用于判断请求消息中的内容是否是“multipart/form-data”类型,是则返回true,否则返回false。isMultipartContent方法是一个静态方法,不用创建ServletFileUpload类的实例对象即可被调用。

6) getFileItemFactory()setFileItemFactory(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"));

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先需要了解的是,org.apache.tomcat.util.http.fileupload.FileUploadBase.RequestContext 是 Apache Tomcat 的文件上传组件中的一部分,而org.apache.commons.fileupload.servlet.ServletFileUpload 则是 Apache Commons FileUpload文件上传组件中的一部分,两者虽然都是用于处理文件上传,但是实现方式略有不同。 如果要使用 org.apache.commons.fileupload.servlet.ServletFileUpload,可以按照以下步骤进行操作: 1. 在项目中引入 Apache Commons FileUpload 的依赖,例如 Maven 中的依赖: ``` <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> ``` 2. 在 Servlet 中使用 ServletFileUpload 解析上传的文件,示例代码如下: ``` protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 检查请求是否包含文件上传部分 boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { // 如果不是文件上传请求,则直接返回 return; } // 创建一个文件上传对象 ServletFileUpload upload = new ServletFileUpload(); try { // 解析上传的文件 FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); if (item.isFormField()) { // 处理普通表单字段 String value = IOUtils.toString(stream, StandardCharsets.UTF_8); // TODO: 处理普通表单字段 } else { // 处理文件上传部分 String filename = item.getName(); // TODO: 处理上传的文件 } } } catch (FileUploadException e) { // 处理异常 } } ``` 在以上代码中,ServletFileUpload 的 isMultipartContent 方法用于判断请求是否包含文件上传部分,getItemIterator 方法用于解析上传的文件,并返回一个 FileItemIterator 对象,该对象包含了所有上传的文件以及普通表单字段。需要注意的是,Apache Commons FileUpload 不需要 RequestContext 来处理请求,而是直接使用 HttpServletRequest 对象来处理文件上传部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值