form表单通过request取不到值multipart/form-data 文件上传表单中传 递参数无法获取的原因!

2023-05-16

1.什么是multipart/form-data
首先我们需要明白在html中的enctype属性, 
enctype:规定了form表单在发送到服务器时候编码方式。他有如下的三个值。 
①application/x-www-form-urlencoded。默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。 
②multipart/form-data 。 指定传输数据为二进制类型,比如图片、mp3、文件。 
③text/plain。纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。

2.明确在enctype参数为application/x-www-form-urlencoded的时候post和get请求参数和请求体是什么形式的
get请求

请求头: 
GET/www.xxx.com?name=%22hello+world%22&**file=temp.png**&submit=submit HTTP/1.1 

因为get请求没有请求体,所有他的所有参数都是在url的后边添加。type=file的表单项只能获取到文件的名字,并不能获取文件的内容。

post请求 
请求头:

POST /www.baidu.com HTTP/1.1
1
2
请求体:

name=%22hello+world%22&file=temp.png&submit=submit
1
2
(1)我们可以发现不管是post请求和get请求,他们的参数存在的形式都是不变的,通过key=value的形式存在。 
(2)表单项type=filed只能获取获取文件的名字不能获取文件的内容。

2. 明确在enctype参数为multipart/form-data的时候post和get请求参数和请求体是什么形式的
get请求 
请求头:

GET/www.xxx.com?name=%22hello+world%22&file=temp.png&submit=submit HTTP/1.1
1
get请求和multipart/form-data结合无效,因为文件上传需要请求体。

post请求:

请求头:

POST /www.xxx.com HTTP/1.1
请求体:

------WebKitFormBoundaryIZDrYHwuf2VJdpHw
Content-Disposition: form-data; name="name"

"hello world"
------WebKitFormBoundaryIZDrYHwuf2VJdpHw
Content-Disposition: form-data; name="file"; filename="temp.png"
Content-Type: image/png

.PNG
.
...
IHDR...
..........Y../..,+|.$aIk.v...G?...P.P,,...m..e.2....v.7.    pHYs...%...%.IR$....|IDAT(.cTT....................:.?.......}.(.Pd`A..V...L...?..#.....4.o..LS.....W.d.?...A8..LS...(.u.......D.b......b.....o&..;..<.1......IEND.B`.
------WebKitFormBoundaryIZDrYHwuf2VJdpHw
Content-Disposition: form-data; name="submit"

submit
------WebKitFormBoundaryIZDrYHwuf2VJdpHw--

通过观察发现这个的请求体就发生了变化。这种请求体被称之为多部件请求体。 
什么是多部件请求体:就是把每一个表单项分割为一个部件。 
因为表单项分为普通表单项和文件表单项,所以说部件也有区别。 
普通表单项: 
一个请求头:Content-Disposition: form-data; name=”name” 
一个请求体:里面就是我们表单的值”hello world”

文件表单项: 
两个请求头:
Content-Disposition: form-data; name="file"; filename="temp.png"

Content-Type: image/png

一个请求体:

.PNG
.
...
IHDR...
..........Y../..,+|.$aIk.v...G?...P.P,,...m..e.2....v.7.    pHYs...%...%.IR$....|IDAT(.cTT....................:.?.......}.(.Pd`A..V...L...?..#.....4.o..LS.....W.d.?...A8..LS...(.u.......D.b......b.....o&..;..<.1......IEND.B`.
------WebKitFormBoundaryIZDrYHwuf2VJdpHw
Content-Disposition: form-data; name="submit"

submit
------WebKitFormBoundaryIZDrYHwuf2VJdpHw--
总结:参数获取不到主要是因为在使用multipart/form-data属性之后请求体发生了变化。不是key=value的形式出现所以说获取不到。 
解决办法: 
(1)我们可以通过js代码来些修改,把我们的参数追加在url的后边。

<form id="upload" name="upload" action="fileftp.jsp" method="post" ENCTYPE="multipart/form-data">
    <input type="hidden" name="otherName" id="otherName" value="abcdefg"/>  
    <td nowrap>
        <input type="file" id="file1" name="file1" value="" size="40" class="sbttn"/>
        <input type="submit" value="上传" class="sbttn"/>
    </td>   
</form>
<script language="javascript">      
function formSubmit(){
    var action="fileftp.jsp";       
    action+="?otherName="+document.upload.otherName.value;
    document.upload.action=action;      
    document.upload.submit();
}
</script>
(2)通过修改服务器端代码。前提是利用jar包。 
commons-fileupload-1.2.2.jar和commons-io-1.4.jar

/创建工厂
        DiskFileItemFactory factoy=new DiskFileItemFactory();
        //创建解析器
        ServletFileUpload sfu=new ServletFileUpload(factoy);
        //解析request
        try {
            List<FileItem> list=sfu.parseRequest(request);

            for (FileItem fileItem : list) {

                fileItem.getFieldName();
                System.out.println(fileItem.getString());
            }

        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
上传图片示例代码:

<h1>添加图书</h1>
    <p style="font-weight: 900; color: red">${msg}</p>
    <form action="<c:url value='/UploadServlet'/>" method="post" enctype="multipart/form-data">

        图书名称:<input style="width: 150px; height: 20px;" type="text" name="bname"/><br/>
        图书图片:<input style="width: 223px; height: 20px;" type="file" name="image"/><br/>
        图书单价:<input style="width: 150px; height: 20px;" type="text" name="price"/><br/>
        图书作者:<input style="width: 150px; height: 20px;" type="text" name="author"/><br/>
        图书分类:<select style="width: 150px; height: 20px;" name="cid">
        <c:forEach items="${list}" var="cate"> 
            <option value="${cate.cid }">${cate.cname }</option>

        </c:forEach>
        </select>
        <br/>
        <input type="submit" value="添加图书"/>
    </form>

package cn.zll.bookstore.adminbook.servlet;

import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.zll.bookstore.adminbook.service.service;
import cn.zll.bookstore.book.domain.Book;

public class UploadServlet extends HttpServlet {


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        service s=new service();
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        //文件上传的三部曲
        //创建工厂
        DiskFileItemFactory factoy=new DiskFileItemFactory();
        //创建解析器
        ServletFileUpload sfu=new ServletFileUpload(factoy);
        //设置上传文件的大小
        sfu.setFileSizeMax(20*1024);
        //解析request
        try {
            List<FileItem> list=sfu.parseRequest(request);
            Book b=new Book();
            b.setBid(UUID.randomUUID().toString().replace("-", ""));
            String bname=list.get(0).getString("utf-8");
            b.setBname(bname);
            System.out.println(bname);
            String price=list.get(2).getString("utf-8");
            b.setPrice(price);
            String author=list.get(3).getString("utf-8");
            b.setAuthor(author);
            String cid=list.get(4).getString("utf-8");
            b.setCid(cid);
            System.out.println(bname+price+author+cid);
//          图书名称:<input style="width: 150px; height: 20px;" type="text" name="bname"/><br/>
//          图书图片:<input style="width: 223px; height: 20px;" type="file" name="image"/><br/>
//          图书单价:<input style="width: 150px; height: 20px;" type="text" name="price"/><br/>
//          图书作者:<input style="width: 150px; height: 20px;" type="text" name="author"/><br/>
//          图书分类:<select style="width: 150px; height: 20px;" name="cid">
//      
//          
            //设置图片保存的目录
            String path=this.getServletContext().getRealPath("/book_img");
            //得到文件名称
            String fileName=UUID.randomUUID().toString().replace("-", "")+"_"+list.get(1).getName();
            //校验图片的格式
            if(!fileName.toLowerCase().endsWith("jpg")){
                System.out.println("图片格式不是jpg");
                request.setAttribute("msg", "你的图片格式不是jpg格式");
                request.getRequestDispatcher("/adminjsps/admin/book/add.jsp").forward(request, response);
                return;
            }
            //使用目录和文件名称创建目标文件
            File f=new File(path,fileName);
            //保存文件
            list.get(1).write(f);
            //校验图片的尺寸
            Image image=new ImageIcon(f.getAbsolutePath()).getImage();
            if(image.getWidth(null)>200 || image.getHeight(null)>200){
                f.delete();
                request.setAttribute("msg", "图片的尺寸太大");
                request.getRequestDispatcher("/adminjsps/admin/book/add.jsp").forward(request, response);

            }
            //设置book的属性
            b.setImage("book_img/"+fileName);
            s.add(b);
            request.setAttribute("msg", "添加成功");
            request.getRequestDispatcher("/adminjsps/admin/book/add.jsp").forward(request, response);
            System.out.println("fileName:"+fileName);
            System.out.println(path);
        } catch (FileUploadException e) {
            if(e instanceof FileUploadBase.FileSizeLimitExceededException){

                System.out.println("你上传的文件大于15K");
                request.setAttribute("msg", "你的图片大于15k");
                request.getRequestDispatcher("/adminjsps/admin/book/add.jsp").forward(request, response);
                return;
            }

            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}
 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

form表单通过request取不到值multipart/form-data 文件上传表单中传 递参数无法获取的原因! 的相关文章

  • 《Zoom to learn Learn to zoom》学习笔记

    创新点 xff1a 使用真实原始LR和HR图像作为数据进行训练网络 xff0c 区别于其他大部分网络 xff08 用HR图和经过HR图进行下采样的LR图作为网络数据进行训练 xff09 采用由CX loss 改进的CoBi loss作为网络
  • cmake安装以及更新

    直接install cmake wget https cmake org files v3 6 cmake 3 6 2 tar gz span class token function tar span zxvf cmake 3 6 2 t
  • manjaro安装以及配置、安装输入法、向日葵、anaconda、pycharm、QQ

    为什么不用Ubuntu xff0c 用manjaro就不说了 xff0c 直接上步骤吧 xff01 1 做个优盘 找个优盘 xff0c 最好是3 0接口吧 xff0c 我用的2 0有点慢 先下载系统 xff0c 找个自己喜欢的风格 Manj
  • Python编程中的常见语句

    4 1 if条件判断语句 4 1 1 if条件判断语句单分支 单分支格式 xff1a if 判断条件 xff1a 语句块1 else xff1a 语句块2 例 xff1a name 61 input 39 请输入您的用户名 39 if na
  • Linux下创建新用户及用户权限

    一 用户创建 增加用户 1 在root权限下 xff1b 命令 xff1a useradd 43 用户名 xff0c 它不会在 home目录下创建同名文件夹 xff0c 也没有创建密码 xff0c 因此利用这个用户登录系统 xff0c 是登
  • cacert.pem是怎么来的

    小弟最近在搞支付宝支付接口 xff0c 碰到个问题 xff0c help 我看demo中有下面一行代码 xff1a PHP code 1 2 3 ca证书路径地址 xff0c 用于curl中ssl校验 请保证cacert pem文件在当前文
  • mapping文件的编写

    mapping文件的编写 xff08 以及实体类与xml中类型的对应关系 xff09 2017年02月18日 11 31 36 转角人生 阅读数 xff1a 2918 标签 xff1a mapping文件 更多 个人分类 xff1a map
  • java-兔子繁殖问题

    題目 xff1a 古典问题 xff1a 有一对兔子 xff0c 从出生后第3个月起每个月都生一对兔子 xff0c 小兔子长到第三个月后每个月又生一 对兔子 xff0c 假如兔子都不死 xff0c 问每个月的兔子总数为多少 xff1f 64
  • Nginx服务器的安装部署和框架简介

    Nginx服务器的安装部署 1 如何获取Nginx服务器安装文件 Nginx服务器的软件版本包括 Windows版 和 Linux版俩种 官网下载地址为http nginx org en download html 网页上提供了Nginx服
  • error - problem conecting

    解决的办法是在树莓派里安装如下模块 xff1a sudo apt get install tightvncserver 接着reboot重启 xff0c 重新连接即可
  • SQL 日期函数应用实例!!

    sql view plain copy select convert varchar 10 getdate 120 只返回当前日期 xff0c 且为2012 12 12格式 xff08 最有用 xff09 sql view plain co
  • 使用docker-compose搭建Harbor私有仓库

    一 安装docker compose 1 下载docker compose的最新版本 curl L 34 https github com docker compose releases download 1 22 0 docker com
  • Zabbix安装部署

    一 服务端安装配置 1 环境检查 root 64 m01 cat etc redhat release CentOS Linux release 7 4 1708 Core root 64 m01 uname r 3 10 0 693 el
  • Docker安装部署

    一 安装 devicemapper 存储驱动 使用说明 xff1a 为了在生产级别的环境中使用 docker 运行环境 xff0c 必须使用 direct lvm 模式来运行devicemapper 存储驱动 这种模式使用块设备来创建 th
  • MySql安装部署

    下载并安装MySQL官方的 Yum Repository wget i c http dev mysql com get mysql57 community release el7 10 noarch rpm 使用上面的命令就直接下载了安装
  • Nginx安装部署

    Nginx 安装配置 Nginx 34 engine x 34 是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器 xff0c 也是一个 IMAP POP3 SMTP 代理服务器 在高连接并发的情况
  • Rancher安装部署

    直接通过docker镜像来运行我们的rancher xff0c 首先 xff0c 先从镜像中心下载rancher镜像 xff0c 如果是1 x系列的 xff0c 镜像名为rancher server xff0c 而2 x是rancher r
  • form表单提交onclick和onsubmit进行表单验证

    onsubmit只能表单上使用 提交表单前会触发 onclick是按钮等控件使用 用来触发点击事件 在提交表单前 xff0c 一般都会进行数据验证 xff0c 可以选择在submit按钮上的onclick中验证 也可以在onsubmit中验
  • iperf3网络测试工具

    一 iperf能用来做什么 测量网络带宽和网络质量提供网络延迟抖动 数据包丢失率 最大传输单元等统计信息 二 iperf3主要功能介绍 TCP 测试网络带宽支持多线程 xff0c 在客户端与服务端支持多重连接报告MSS MTU值的大小支持T
  • C++多线程5-单例模式详解

    单例模式 xff1a 只允许创建一个类对象 xff0c 实现的关键是将构造函数变为私有 单例模式有几种实现方式 xff1a 懒汉模式饿汉模式线程安全模式 锁实现和call once实现 局部静态变量模式 1 懒汉模式 当需要使用类对象时 x

随机推荐

  • c++多线程1-多线程的创建

    什么是多线程 xff1f 我们可以理解为一个线程执行一个代码段 xff0c 所以多个线程就是执行多个代码段 xff0c 如果当一个线程结束后 xff0c 进程就退出了 xff0c 这个线程我们称之为主线程 每个进程可以有一个或一个以上的线程
  • c++多线程2-线程参数传递需要注意的几个问题

    一 线程的初始化参数需要注意以下几个问题 xff1a 1 回调函数使用引用参数接收值时 xff0c 必须声明为const xff0c 否则报错 xff1b xff08 线程基于数据安全保护的考虑 xff09 2 回调函数必须声明为指针 xf
  • c++11-智能指针

    c 43 43 智能指针 为了更安全地管理动态内存 xff0c c 43 43 11引入了智能指针 xff0c 提供了包括shared ptr unique ptr weak ptr三种不同类型的智能指针 目录结构 xff1a 一 三种指针
  • C++多线程3-共享数据操作保护

    目录 xff1a 1 多线程操作共享数据引出的问题 2 解决多线程操作共享数据的方法 xff1a 锁 3 互斥量mutex的概念和用法 4 lock普通锁的用法 5 lock guard类模板的用法 6 死锁的概念和解决 7 unique
  • C++多线程4-unique_lock详解

    unique lock和lock guard都是可以自动解锁的类 xff0c 但是lock guard更加高效体现在永远在析构函数中解锁 xff0c 而unique lock更加灵活 xff0c 但执行效率会比lock guard低一些 x
  • C++多线程6-条件变量

    1 条件变量 std condition variable是多线程中经常用到的一个类 xff0c 它的头文件为condition variable 它常用的成员函数包括 xff0c wait notify one notify all等 它
  • Centos6.5系统升级软件操作文档

    为什么要用Centos6 5系统 xff1f 答 xff1a 因为计算板官方推荐Centos6 5 为什么要升级软件 xff1f 答 xff1a 软件需支持C 43 43 11相关库 1 系统信息 系统版本 xff1a CentOS 6 5
  • c++11多线程7-异步线程

    异步线程 异步线程的引入解决了线程有依赖关系的情景 c 43 43 11提供了std async xff0c std packaged task xff0c std promise xff0c 三种方法 1 std async std as
  • HTML中meta标签如何正确使用

    HTML中 lt meta gt 标签如何正确使用 如果我们在浏览器中按下F12或者Ctrl 43 shift 43 J xff0c 便可以打开开发者工具 xff0c 在element中即可看到 lt head gt 元素中有不少 lt m
  • 4.Linux网络编程-select和poll模型

    目录 xff1a 1 补充知识 2 简易版回射服务器的实现 3 select模型实现 4 poll模型实现 1 补充知识 span class token comment 显示进程的pid xff1a span span class tok
  • 5.Linux网络编程-select实现超时API

    一 alarm函数设置超时 它的主要功能是设置信号传送闹钟 信号SIGALRM在经过seconds指定的秒数后传送给目前的进程 xff0c 如果在定时未完成的时间内再次调用了alarm函数 xff0c 则后一次定时器设置将覆盖前面的设置 x
  • 6.Linux网络编程-epoll原理

    一 xff1a 对比select发现epoll的有点 要比较epoll相比较select高效在什么地方 xff0c 就需要比较二者做相同事情的方法 要完成对I O流的复用需要完成如下几个事情 xff1a 1 用户态怎么将文件句柄传递到内核态
  • 7.Linux网络编程-UNIX域套接字

    一 xff1a UNIX套接字 用于同一台pc上运行的进程之间通信 xff0c 它仅仅复制数据 xff0c 不执行协议处理 xff0c 不需要增加删除网络报头 xff0c 无需计算校验和 xff0c 不产生顺序号 xff0c 无需发送确认报
  • 8.Linux网络编程-System V消息队列

    一 xff1a 消息队列 消息队列是进程间通信的一种手段 xff0c 进程产生的数据块以链表的形式存储在消息队列中 xff0c 每个数据块都被认为是有一个类型 xff0c 接收者进程接收的数据块可以有不同的类型 消息队列有以下的几个限制 x
  • 9.Linux网络编程-SYSTEM V共享内存

    一 xff1a 内存映射文件 1 基本原理 mmap是一种内存映射文件的方法 xff0c 即将一个文件或者其它对象映射到进程的地址空间 xff0c 实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系 实现这样的映射关系后 xff
  • ubuntu16.04安装openstack(ocata)

    一 系统和openstack信息 Liunx系统 xff1a ubuntu16 04 server 64位 openstack版本 xff1a stable ocata 二 VMware配置 1 处理器 xff1a 数量1 xff0c 核心
  • 代码注释规范

    一 背景 1 当我们第一次接触某段代码 xff0c 但又被要求在极短的时间内有效地分析这段代码 xff0c 我们需要什么样的注释信息 xff1f 2 怎么样避免我们的注释冗长而且凌乱不堪呢 xff1f 3 在多人协同开发 维护的今天 xff
  • 1.Linux网络编程-字节序和地址转换函数

    1 IPv4套接口地址结构 IPv4套接口地址结构通常称为 网际套接字地址结构 xff0c 它以 sockaddr in 命名 xff0c 定义在头文件 lt netinet in h gt 中 struct sockaddr in uin
  • 2.Linux网络编程-socket函数和C2S实现

    1 TCP客户 服务器模型 TCP服务器 xff1a socket gt bind gt listen gt accept gt block直至客户连接到达 gt read gt 处理请求 gt write gt read gt close
  • form表单通过request取不到值multipart/form-data 文件上传表单中传 递参数无法获取的原因!

    1 什么是multipart form data 首先我们需要明白在html中的enctype属性 xff0c enctype xff1a 规定了form表单在发送到服务器时候编码方式 他有如下的三个值 application x www