【java】enctype=“multipart/form-data“的form表单无法得到request.getParameter()的值的解决办法

〇、前情提要

上传文件使用了enctype="multipart/form-data"的,但servlet里面用request.getParameter()方法无论如何都只能获得null值。

enctype="multipart/form-data"类型的表单提交的值是不可以直接用JSP的内置对象request对象取值的,因为这是二进制数据,必须使用上传组件附带的Request类,比如(SmartUpload里面的Request类),所以要保存上传文件的其它信息,就要取得上传组件的Request类对象就可以了…取值方法还是:request.getParameter(“name”);

参考:
网上随便找的UploadHandleServlet,忘了网址是什么,下面有附。


一、分析

一个form表单传空文件

在这里插入图片描述
写一个普通的UploadHandleServlet


public class UploadHandleServlet extends HttpServlet {
   

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   
                //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
                String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
                File file = new File(savePath);
                //判断上传文件的保存目录是否存在
                if (!file.exists() && !file.isDirectory()) {
   
                    System.out.println(savePath+"目录不存在,需要创建");
                    //创建目录
                    file.mkdir();
                }
                //消息提示
                String message = "";
                try{
   
                    //使用Apache文件上传组件处理文件上传步骤:
                    //1、创建一个DiskFileItemFactory工厂
                    DiskFileItemFactory factory = new DiskFileItemFactory();
                    //2、创建一个文件上传解析器
                    ServletFileUpload upload = new ServletFileUpload(factory);
          
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当表单的 enctype 属性设置为 "multipart/form-data" 时,表单数据会以二进制流的形式传输,而不是以普通的键对的形式传输。因此,使用 request.getParameter() 方法获取表单参数时会获取不到。 要获取 "multipart/form-data" 表单的参数,可以使用 Apache Commons FileUpload 组件。这个组件可以将表单数据解析成文件和字段两个部分,从而可以获取表单的参数。 具体实现步骤如下: 1. 在 JSP 页面中引入 Apache Commons FileUpload 组件的相关库文件。可以从官网下载这些文件,然后将其放置到 WEB-INF/lib 目录下。 2. 在表单的处理程序中,使用 Apache Commons FileUpload 组件解析表单数据。具体实现代码如下: ``` // 创建 DiskFileItemFactory 对象 DiskFileItemFactory factory = new DiskFileItemFactory(); // 创建 ServletFileUpload 对象 ServletFileUpload upload = new ServletFileUpload(factory); // 解析表单数据 List<FileItem> items = upload.parseRequest(request); // 遍历表单数据 for (FileItem item : items) { if (item.isFormField()) { // 处理普通字段 String name = item.getFieldName(); String value = item.getString("UTF-8"); // TODO: 处理表单参数 } else { // 处理文件字段 String name = item.getFieldName(); String fileName = item.getName(); InputStream inputStream = item.getInputStream(); // TODO: 处理文件上传 } } ``` 在上述代码中,使用 DiskFileItemFactory 对象和 ServletFileUpload 对象来解析表单数据。解析结果会以 List<FileItem> 的形式返回,然后遍历这个列表,分别处理普通字段和文件字段。 对于普通字段,可以使用 FileItem 对象的 getFieldName() 方法获取字段名,使用 getString() 方法获取字段。 对于文件字段,可以使用 FileItem 对象的 getName() 方法获取文件名,使用 getInputStream() 方法获取文件数据流。 需要注意的是,在解析表单数据之前,需要设置 request 的字符编码为 UTF-8,以便正确处理中文字符。可以通过在 JSP 页面中设置以下代码来实现: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值