本系列博客汇总在这里:文件上传下载汇总汇总


一、commons-fileupload

1、上传文件的要求

  • 必须是 post 表单;
  • 表单的 enctype 必须是 multipart/form-data;
  • 在表单中添加 file 表单字段,即 <input type=”file”…/>

2、Servlet 的要求

  • 不能再使用 request.getParameter() 来获取表单数据;
  • 可以使用 request.getInputStream() 得到所有的表单数据,而不是一个表单项的数据;
  • 这说明不使用 fileupload,我们需要自己来对 request.getInputStream() 的内容进行解析!!!
二、fileupload 概述

fileupload 是由 apache 的 commons 组件提供的上传组件。它最主要的工作就是帮我们解析 request.getInputStream()
fileupload 组件需要的 JAR 包有:

  • commons-fileupload.jar,核心包;
  • commons-io.jar,依赖包。
    文件上传下载(2)_commons-fileupload_表单
三、fileupload 简单应用

fileupload 的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem。
使用 fileupload 组件的步骤如下:

  • (1)创建工厂类 DiskFileItemFactory 对象:DiskFileItemFactory factory = new DiskFileItemFactory();
  • (2)使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(factory);
  • (3)使用解析器来解析 request 对象:List<FileItem> list = fileUpload.parseRequest(request);

隆重介绍 FileItem 类,它才是我们最终要的结果。一个 FileItem 对象对应一个表单项(表单字段)。一个表单中存在文件字段和普通字段,可以使用 FileItem 类的 isFormField() 方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了。

  • String getName():获取文件字段的文件名称。
  • String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件。
  • String getFieldName():获取字段名称,例如:<input type="text" name="username"/>,返回的是username。
  • String getContentType():获取上传的文件的类型,例如:text/plain。
  • Long getSize():获取上传文件的大小。
  • boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回 false,说明是文件字段。
  • InputStream getInputStream():获取上传文件对应的输入流。
  • void write(File):把上传的文件保存到指定文件中。
四、简单上传示例

1、编写 jsp 页面 upload.jsp。注意表单必须是 post 的,而且 enctype 必须是 mulitpart/form-data 的。
文件上传下载(2)_commons-fileupload_上传_02
2、编写 servlet(FileUploadServlet) 。
文件上传下载(2)_commons-fileupload_commons-fileupload_03
3、在 web.xml 文件中部署。
文件上传下载(2)_commons-fileupload_字段_04
4、访问请求(http://localhost:8080/file_upload1/upload.jsp)页面 upload.jsp 查看效果。
文件上传下载(2)_commons-fileupload_表单_05
文件上传下载(2)_commons-fileupload_字段_06
文件上传下载(2)_commons-fileupload_上传文件_07

如果需要本文当中涉及的完整代码,请下载汇总处的项目文件。

如有错误,欢迎指正!