文件上传概述

文件上传需要满足特定的HTML表单设置,如POST方法和multipart/form-data编码。Servlet处理文件上传时,不能使用getParameter,而需通过getInputStream读取。Apache Commons FileUpload提供了解析上传数据的工具,简化了文件上传处理。该组件涉及的核心类包括DiskFileItemFactory、ServletFileUpload和FileItem,通过它们可以方便地解析和操作上传文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件上传对页面的要求

  1. 必须使用表单,而不能是超链接;
  2. 表单的method必须是POST,而不能是GET;
  3. 表单的enctype必须是multipart/form-data;
  4. 在表单中添加file表单字段,即<input type=”file”…/>
    文件上传对Servlet的要求
    当提交的表单是文件上传表单时,那么对Servlet也是有要求的。
    首先我们要肯定一点,文件上传表单的数据也是被封装到request对象中的。
    request.getParameter(String)方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。
    这时可以使用request的getInputStream()方法获取ServletInputStream对象,它是InputStream 的子类,这个ServletInputStream对象对应整个表单的正文部分(从第一个分隔线开始,到最后),这说明我们需要的解析流中的数据。当然解析它是很麻烦的一件事情,而Apache已经帮我们提供了解析它的工具:commons-fileupload。
      可以尝试把request.getInputStream()这个流中的内容打印出来,再对比httpWatch中的请求数据。
    commons-fileupload

为什么使用fileupload:
上传文件的要求比较多,需要记一下: 必须是POST表单;
 表单的enctype必须是multipart/form-data;
 在表单中添加file表单字段,即

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

fileupload概述
fileupload是由apache的commons组件提供的上传组件。它最主要的工作就是帮我们解析request.getInputStream()。
fileupload组件需要的JAR包有:
 commons-fileupload.jar,核心包;
 commons-io.jar,依赖包。

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

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

隆重介绍FileItem类,它才是我们最终要的结果。一个FileItem对象对应一个表单项(表单字段)。一个表单中存在文件字段和普通字段,可以使用FileItem类的isFormField()方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了。
 String getName():获取文件字段的文件名称;
 String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;
 String getFieldName():获取字段名称,例如:,返回的是username;
 String getContentType():获取上传的文件的类型,例如:text/plain。
 int getSize():获取上传文件的大小;
 boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回false,说明是文件字段;
 InputStream getInputStream():获取上传文件对应的输入流;
 void write(File):把上传的文件保存到指定文件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值