`
thaIm
  • 浏览: 91790 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Commons FileUpload

阅读更多
一) 基础简介:
    1、FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。
    2、组件FileUpload依赖于Commons IO组件。 目前FileUpload的最新版本是1.2.2 ,对于此版本官方推荐的依赖的IO组件版本是1.3.2
    3、FileUpload 是基于RFC1867协议实现的。
    4、API: http://commons.apache.org/fileupload/apidocs/index.html

二)RFC1867协议:
    RFC1867协议作为HTTP协议的附加协议,详细描述了File Upload的规则。RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data,当然还增加了一些与此相关属性。
    比如value属性表示默认的上传文件的文件名(无文件上传时生效)
         width表示默认的显示文件名的长度
         height表示显示上传文件的个数

    例子:
    <FORM ACTION="http://server.dom/cgi/handle" ENCTYPE="multipart/form-data"  METHOD=POST>
     What is your name? <INPUT TYPE=TEXT NAME=field1>
     What files are you sending? <INPUT TYPE=FILE NAME=pics>
    </FORM>
    假设用户在name一栏里输入"Joe Blow",上传了一个文件名叫"file1.txt"的文件。那么浏览器将发送的包格式会是这样:
        Content-type: multipart/form-data, boundary=AaB03x

        --AaB03x
        content-disposition: form-data; name="field1"

        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"; filename="file1.txt"
        Content-Type: text/plain

         ... contents of file1.txt ...
        --AaB03x--
    如果上传的文件中还包含一个叫"file2.gif"的图片,那么包格式将会是这样:
        Content-type: multipart/form-data, boundary=AaB03x

        --AaB03x
        content-disposition: form-data; name="field1"

        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"
        Content-type: multipart/mixed, boundary=BbC04y

        --BbC04y
        Content-disposition: attachment; filename="file1.txt"
        Content-Type: text/plain

        ... contents of file1.txt ...
        --BbC04y
        Content-disposition: attachment; filename="file2.gif"
        Content-type: image/gif
        Content-Transfer-Encoding: binary

          ...contents of file2.gif...
        --BbC04y--
        --AaB03x--

    总结:
    RFC1867对HTTP头作了适当地变更,但变更很小。首先content-type头由以前的:
      content-type: application/x-www-form-urlencoded
    变为
      content-type: multipart/form-data; +空格+ boundary=AaB03x
    即增加了boundary,所谓的boundary其实就是分割线,RFC1867利用boundary分割HTTP实体数据。boundary中数字字符区是随机生成的。

三)代码样例:
    最简单的一个例子:
     
      // Create a factory for disk-based file items 
      FileItemFactory factory = new DiskFileItemFactory(); 
      // Create a new file upload handler 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      // Parse the request 
      List <FileItem> items = upload.parseRequest(request); 

    如上我们就把request的所有信息包括上传文件的信息都转换到items这个对象里去了。

    再增加一点点控制:
     
      // Create a factory for disk-based file items 
      DiskFileItemFactory factory = new DiskFileItemFactory(); 
      // Sets the size threshold beyond which files are written directly to disk. 
      factory.setSizeThreshold(yourMaxMemorySize);
      // Sets the directory used to temporarily store files that are larger than the configured size threshold. 
      factory.setRepository(yourTempDirectory); 
      // Create a new file upload handler 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      // Sets the maximum allowed size of a complete request 
      upload.setSizeMax(yourMaxRequestSize); 
      // Parse the request 
      List <FileItem> items = upload.parseRequest(request);

   
    FileItem的处理:
     
      Iterator iter = items.iterator(); 
      while (iter.hasNext()) { 
        FileItem item = (FileItem) iter.next(); 
        if (item.isFormField()) { // Process a regular form field 
            String name = item.getFieldName(); 
            String value = item.getString(); 
        } else { // Process a file upload 
            String fieldName = item.getFieldName(); 
            String fileName = item.getName(); 
            String contentType = item.getContentType(); 
            boolean isInMemory = item.isInMemory(); 
            long sizeInBytes = item.getSize(); 
        } 
      }

     这里有必要对FileItem的一些方法做进一步的介绍:
     public boolean isFormField() -- 用于判断 FileItem 类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段,如果是普通表单字段则返回 true,否则返回 false。
     public String getName() -- 依据RFC1867协议返回的是filename的内容。以上文例子为例,返回值将是“file1.txt” 或 “file2.gif”。如果 FileItem 类对象对应的是普通表单字段,getName 方法将返回 null。
     public String getFieldName() -- 依据RFC1867协议返回的是name的内容。以上文例子为例,返回值将是“field1” 或 “pics”。
     public void write(File  file) -- 用于将 FileItem 对象中保存的主体内容保存到某个指定的文件中。如果 FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。
     public boolean isInMemory() -- 用来判断 FileItem 类对象封装的主体内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回 true,否则返回false。
     public void delete() -- 用来清空 FileItem 类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete 方法将删除该临时文件。

    上传文件的保存:
    
     File uploadedFile = new File(...);
     item.write(uploadedFile);


四)注意点:
对于fileupload,一共有3种上传文件的处理方式:
    DiskFileUpload, ServletFileUpload, PortlerFileUpload
他们的区别是:
    ServletFileUpload 最常用的类,大多情况我们就用它了。
    DiskFileUpload 已被标记为Deprecated,由ServletFileUpload取代。
    PortletFileUpload  需配合portlet的api一起使用(本人至今没用过 = =!)
分享到:
评论

相关推荐

    Apache Commons FileUpload 1.3.2 released

    Commons FileUpload 1.3.2. The Apache Commons FileUpload component provides a simple yet flexible means of adding support for multipart file upload functionality to servlets and web applications. ...

    commons fileupload

    Commons FileUpload是Apache组织提供的一款强大的Java文件上传处理组件,常用于Web应用中处理用户通过表单上传的文件。在Web开发中,尤其是在涉及到用户上传照片、文档等大文件时,FileUpload组件提供了方便、高效的...

    Jakarta Commons FileUpload 用户指南

    ### Jakarta Commons FileUpload 用户指南知识点总结 #### 一、FileUpload 概览 - **Jakarta Commons FileUpload** 是一个用于处理HTTP文件上传的Java库,它基于**RFC1867**标准来解析和处理文件上传请求。 - **...

    Apache Commons fileUpload实现文件上传

    1. 添加依赖:在项目中引入Apache Commons IO和FileUpload的JAR文件,或者在Maven或Gradle项目中添加对应的依赖。 2. 创建Servlet或控制器:设置请求的解析器,例如在Servlet中使用`ServletFileUpload`类。 3. ...

    commons-fileupload-1.4-bin.zip

    《Apache Commons FileUpload组件详解》 Apache Commons FileUpload是一个用于处理HTTP请求中多部分数据的Java库,尤其在上传文件时极为有用。标题中的"commons-fileupload-1.4-bin.zip"表明这是一个包含Apache ...

    commons-fileupload-1.3.3.zip

    Apache Struts2 Commons FileUpload反序列化远程代码执行漏洞安全公告 安全公告编号:CNTA-2018-0029 2018年11月7日,国家信息安全漏洞共享平台(CNVD)收录了Apache Struts2 Commons FileUpload反序列化远程代码...

    commons-fileupload-1.3.2jar包和commons-io-2.5jar包.zip

    Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传和I/O操作的重要库。这两个库在处理Web应用,特别是基于JSP(JavaServer Pages)的文件上传功能时,扮演着核心角色。在这个主题中,我们将...

    commons-fileupload和commons-io的jar包

    Apache Commons FileUpload与Apache Commons IO是Java开发中两个非常重要的库,它们主要用于处理文件上传和I/O操作。这两个库在Web应用、数据处理以及文件管理等领域广泛应用。 Apache Commons FileUpload库是一个...

    commons commons-fileupload历史版本jar包集合

    commons commons-fileupload历史版本jar包集合,包括src源码 附件列表: commons-fileupload-1.0.zip commons-fileupload-1.1.1.zip commons-fileupload-1.1.zip commons-fileupload-1.2.1-bin.zip commons-...

    commons-fileupload-1.4 jar包.rar

    《Apache Commons FileUpload详解》 在Java开发中,处理用户上传文件是一项常见的任务。Apache Commons FileUpload组件就是为了解决这一问题而设计的,它提供了一套完整的解决方案,使得开发者可以方便、高效地处理...

    Apache Commons FileUpload jar

    Apache Commons FileUpload jar Apache Commons FileUpload jar Apache Commons FileUpload jar

    commons-fileupload-1.4-API文档-中文版.zip

    赠送jar包:commons-fileupload-1.4.jar; 赠送原API文档:commons-fileupload-1.4-javadoc.jar; 赠送源代码:commons-fileupload-1.4-sources.jar; 赠送Maven依赖信息文件:commons-fileupload-1.4.pom; 包含...

    上传组件Commons fileUpload.jar剖析

    ### 上传组件Commons fileUpload.jar剖析 #### 一、简介 Apache Commons FileUpload 是一个用于解析`multipart/form-data`编码格式数据的Java库。这种编码格式常用于表单提交时上传文件。FileUpload能够将HTML表单...

    使用commons fileupload 和commons io jar包操作实例项目

    Apache Commons FileUpload和Commons IO库为处理文件上传提供了强大的支持。这两个库都是Apache软件基金会开发的开源组件,广泛应用于各种Java项目中。 Apache Commons FileUpload库主要用于处理HTTP协议中的多部分...

    开发工具 commons-fileupload-1.3.2

    开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2...

    commons-fileupload所有版本(1.0-1.3).zip

    Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的文件上传功能。这个压缩包包含了从1.0到1.3的所有版本,这是一段跨越时间较长的更新历史,每个版本都可能包含了一些改进、修复和新特性。让我们...

    commons fileupload实现文件上传的实例代码

    首先,你需要在项目中引入两个JAR包:`commons-fileupload.jar`和`commons-io.jar`。然后,在Servlet中,你可以使用FileUpload类来解析请求并获取上传的文件。以下是一个简单的实现步骤: 1. 创建一个`...

    commons-fileupload文档及源代码.rar

    本文将详细介绍`commons-fileupload`库的功能、工作原理以及如何使用。 **一、Apache Commons FileUpload简介** Apache Commons FileUpload是Apache软件基金会的一个开源项目,它提供了处理HTTP多部分/表单数据的...

    commons fileupload用于文件上传

    在Java EE开发中,文件上传是一项常见的功能,Apache Commons FileUpload库正是为了处理这个需求而设计的。这个库提供了一套强大的API,使得在Servlet环境中处理文件上传变得简单且高效。下面将详细介绍Apache ...

Global site tag (gtag.js) - Google Analytics