jsp 上传文件及实体信息,ajax post 请求(formdata)报错400<======>前后端代码示例

news2024/11/15 11:40:01

Content-Type最常见的几种类型:

通常,没有声明,默认application/x-www-form-urlencoded

application/x-www-form-urlencoded  form表单默认的数据格式,提交的数据形式 key1=val1&key2=val2(参数少)

multiple/form-data 一般用来上传文件,也可以上传普通数据

application/json json对象(参数多)

post请求postman的几种参数格式区别:

form-data对应的是以form表单提交传值的情形,等价于http请求中的multipart/form-data

x-www-form-urlencoded即application/x-www-from-urlencoded,将表单内的数据转换为Key-Value;

raw对应的是入参是任意格式的可以上传任意格式的【文本】,可以上传text、json、xml、html等,使用较少;

binary相当于Content-Type:application/octet-stream,只可以上传二进制数据,通常用来上传文件,但是一次只能上传一个文件;

 毫无前端基础的开发人员,独立完成页面开发,排查问题,困难重重!摸索虽然浪费时间,无法按时完成任务,但这些坑终究是要自己去踩的!不够了解contentType,不清楚传payload数据是啥,也不清楚web页面inspect的使用!经过几天不懈努力完成相关页面设计。交互的问题又来了,这不使用网上的开源代码,自己在家里琢磨,倒腾出来的东西,在公司再验证,遇到了HttpServletRequest无法解析上传的文件,目前没时间去处理。ssh项目架构历史悠久,需要学习的东西居多,工作任务也不轻,忙完前端忙后端。。。

言归正传,问题排查思路。

百度之后,发现是传的参数与后端接口定义的RequestParam的key对应不上。

无外乎:请求参数key一定出错了,或者标签里的name没有填写

79a17cddfcc479d359e96d70e500851a.png

后端接口定义

@RequestMapping(value = "/user/employ/info/upload", method = RequestMethod.POST)
@ResponseBody
public void uploadUserCdAndHm(@RequestParam("cifNo") String cifNo,
                              @RequestParam("name") String name,
                              @RequestParam("employerNo") String employerNo,
                              @RequestParam("type") String type,
                              @RequestParam("permitNo") String permitNo,
                              @RequestParam("permitStart") String permitStart,
                              @RequestParam("permitEnd") String permitEnd,
                              @RequestParam("tpFace") MultipartFile feFaceFile,
                              @RequestParam("tpBack") MultipartFile feBackFile,
                              @RequestParam("employerCredential") MultipartFile biz,
                              HttpSession session, HttpServletRequest request) throws Exception, ApplicationException {

    System.err.println("feFaceFile:" + feFaceFile.getSize());
    System.err.println("feBackFile:" + feBackFile.getSize());
    System.err.println("biz:" + biz.getSize());
    System.err.println("cifNo:" + cifNo);
    // 其他的就不展示了

}

前端div及script

 <div id="tbEmployer">
        <form id="tbEmployerform" method="post" modelAttribute="tbEmployer">
            <table>
                <tr bgcolor="#a9a9a9">
                    <td width="10%" align="left" colspan="10"><h3>勞務信息</h3></td>
                </tr>

                <tr>
                    <td width="12%" align="right"><h3>*僱主姓名(中文):</h3></td>
                    <td align="left">

                        <p class="error-msg" style="color:red; margin:0"></p>
                        <input type="text" id="name" name="name" value="${tbEmployer.name}" required="required"
                               style="width:50%;"
                               maxlength="30"/>
                    </td>
                    <td width="12%" align="right"><h3>*商業登記證號:</h3></td>
                    <td align="left">

                        <p class="error-msg" style="color:red; margin:0"></p>
                        <input type="text" id="employerNo" name="employerNo" value="${tbEmployer.employerNo}"
                               required="required" style="width:50%;"
                               maxlength="10"/>
                        <input type=text style="display:none" name = "cifNo" value="${tbUser.cifNo}">
                    </td>
                </tr>
                <tr>
                    <td width="12%" align="right"><h3>*外僱證類型:</h3></td>
                    <td align="left">

                        <p class="error-msg" style="color:red; margin:0"></p>
                        <input type="text" id="type" name="type"
                               value=${empty idTypeMap[tbEmployer.type] ? tbEmployer.type : idTypeMap[tbEmployer.type]}
                                       required="required" style="width:50%;"
                               maxlength="10"/>
                    </td>
                    <td width="12%" align="right"><h3>*外僱證號碼:</h3></td>
                    <td align="left">

                        <p class="error-msg" style="color:red; margin:0"></p>
                        <input type="text"  id="permitNo" name="permitNo" value="${tbEmployer.permitNo}"
                               required="required" style="width:50%;"
                               maxlength="10"/>
                    </td>
                </tr>
                <tr>
                    <td width="12%" align="right"><h3>*外僱證簽發日期:</h3></td>
                    <td align="left">
                       <fmt:formatDate value="${tbEmployer.permitStart}" var="permitStart" pattern="yyyy-MM-dd"/>
                        <input type="text" name="permitStart" path="permitStart" value="${tbEmployer.permitStart}"/>
                    </td>

                    <td width="12%" align="right"><h3>*外僱證有效期至:</h3></td>
                    <td align="left">
                       <fmt:formatDate value="${tbEmployer.permitEnd}" var="permitEnd" pattern="yyyy-MM-dd"/>
                        <input type="text" name="permitEnd"  path="permitEnd" value="${tbEmployer.permitEnd}"/>
                    </td>
                </tr>

                <tr>
                    <td width="12%" align="right"><h3>*外僱證影像:</h3></td>
                    <td align="left">
                        <div id="tpFaceDiv"><img id="previewTpFace" width=-1 height=-1 style="display:none"/>
                            <input type="file" name="tbFace" id="tpFace"
                                   onchange="javascript:setImagePreview4TpFace();">
                        </div>

                    </td>

                    <td align="left">
                        <div id="tpBackDiv"><img id="previewTpBack" width=-1 height=-1 style="diplay:none"/>
                            <input type="file" name="tpBack" id="tpBack"
                                   onchange="javascript:setImagePreview4TpBack();">
                        </div>

                    </td>
                </tr>

                <tr>
                    <td width="12%" align="right"><h3>*僱主商業登記證影像:</h3></td>
                    <td align="left">
                        <div id="localImag"><img id="preview" width=-1 height=-1 style="diplay:none"/>
                            <input type="file" name="employerCredential" id="employerCredential"
                                   onchange="javascript:setImagePreview();">
                        </div>

                    </td>
                </tr>

            </table>
            <input type="button" id="employSubmit" value=上传 onclick="uploadUserEmploy()">
        </form>
    </div>


<script>
    function uploadUserEmploy() {
        console.log("employer upload!")
        var uploadFile = new FormData($("#tbEmployerform")[0]);
        console.log("upload info:" + uploadFile)
        $.ajax({
            url:"${ctx}/user/employ/info/upload.html",
            type:"post",
            data:uploadFile,

            contentType: false, //不设置内容类型
            processData: false, //不处理数据
            success:function(data){
                alert("已上傳!");
            }
        });
    }
</script>

 错误之处

 将tbFace改成tpFace即可!问题就处理啦!

 formdata

总结

上传文件,不进行页面跳转(ajax)。上传文件中间出现,请求方式一致、url漏了后缀报错405!

post 请求,formdata,报错400,请求参数与接口定义的名称不一致!


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计线上社区管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

〖全域运营实战白宝书 - 高转化文案速成篇③〗- 高打开率标题型文案的10大黄金法则

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

第一期 | 整洁,从桌面开始

文章目录前言一、主要内容介绍二、文件分类&#xff0c;整理你的桌面1.网格对齐图标&#xff0c;取消自动排列2.保持工作状态&#xff0c;提取近期文件3.用好排序&#xff0c;让文件一目了然4.分类整理&#xff0c;让文件听你的话5.按照实际情况作调整三、合理归档&#xff0c;…

[附源码]JAVA毕业设计框架的企业机械设备智能管理系统的设计与实现(系统+LW)

[附源码]JAVA毕业设计框架的企业机械设备智能管理系统的设计与实现&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支…

文献阅读-VQAR-基于计算机视觉和自然语言处理的信息检索技术综述

VQAR: Review on Information Retrieval Techniques based on Computer Vision and Natural Language Processing 标题&#xff1a;VQAR-基于计算机视觉和自然语言处理的信息检索技术综述 Authors&#xff1a;Shivangi ModiDhatri Pandya Journal&#xff1a;2019 3rd Inter…

在Docker中运行Dubbo应用,详细教程,一学就会

Dubbo概述 Dubbo是阿里开源的一个分布式服务框架&#xff0c;在国内粉丝很多。官网上的介绍是&#xff1a; DUBBO是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;是阿里巴巴SOA服务化治理方案的核心框架&#xff0c;每天为2,000…

Spring_第2章_注解开发+整合Mybatis+Junit

Spring_第2章_注解开发整合MybatisJunit 文章目录Spring_第2章_注解开发整合MybatisJunit一、第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池【重点】1.2 管理c3p0连接池2 加载properties属性文件【重点】问题导入2.1 基本用法2.2 配置不加载系统属…

浅谈Android输入法(IME)架构

简介&#xff1a; 输入法 (IME) 是一种可让用户输入文本的用户控件。Android 提供了一种可扩展的输入法框架。借助该框架&#xff0c;应用可以为用户提供备选输入法&#xff0c;例如屏幕键盘&#xff0c;甚至语音输入。安装所需的 IME 后&#xff0c;用户可以从系统设置中选择要…

每日一题:斐波那契数列

每日一题&#xff1a;斐波那契数列 我们先来看一下斐波那契数列的定义&#xff1a; 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而…

Linux进程调度(二)——主动调度

目录 分析__schedule() 第一步&#xff1a; 第二步&#xff1a; pick_next_task的实现如下&#xff1a; 第三步&#xff1a; 进程上下文切换 内存空间的切换&#xff1a; 寄存器和栈的切换switch_to 指令指针的保存与恢复 总结 进程的调度分为两种方式&#xff0c;本篇…

MOOC——多项式加法(5分)好难!

1.多项式加法&#xff08;5分&#xff09; 题目内容&#xff1a; 一个多项式可以表达为x的各次幂与系数乘积的和&#xff0c;比如&#xff1a; 2x63x512x36x20 现在&#xff0c;你的程序要读入两个多项式&#xff0c;然后输出这两个多项式的和&#xff0c;也就是把对应的幂…

java GUI 实现的socket在线聊天系统项目源码运行教程

大家好&#xff0c;今天给大家演示一下一个简单的图形界面的聊天程序&#xff0c;上次我们演示的是Java实现的群聊程序&#xff0c;还可以发送文件&#xff0c;今天这个小程序只能聊天&#xff0c;不能发文件&#xff0c;功能非常简单&#xff0c;可在局域网内实现互相聊天&…

html当当书网站 html网上在线书城 html在线小说书籍网页 当当书城网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

社区系统项目复盘-7

文章目录Spring Security权限控制置顶、加精、删除Redis高级数据类型网站数据统计使用Spring Security进行权限控制&#xff0c;对登录检查功能进行了重写。对不同的登录账号授予不同的权限&#xff0c;实现了置顶、加精、删除功能。使用Redis高级数据类型HyperLogLog和Bitmap实…

2-分类问题 SVM 核函数

目录 一&#xff0c;核函数的引入 二&#xff0c;核函数的定义 三&#xff0c;核函数介绍&#xff1a; 四&#xff0c;核函数总结&#xff1a; 一&#xff0c;核函数的引入 世界上本来没有两个完全一样的物体&#xff0c;对于所有的两个物体&#xff0c;我们可以通过增加维…

ES6 Reflect

前言 此文总结了Reflect对象的部分语法&#xff0c;对比了与Object方法的差异性&#xff0c;希望对你有用。 语法 Reflect与Math类似&#xff0c;都是JavaScript内置对象&#xff0c;提供了工具方法。 typeof Reflect // objectget Reflect.get(target, property, receiver) …

冷热电气多能互补的微能源网鲁棒优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux——VIM编辑器(详细)

目录 一、基本简介 1.1 基本简介 1.2 我们怎么使用终端进入到桌面&#xff1f; 1.3 模式间转换 二、一般模式 2.1 操作指令 2.2 什么情况下是一般模式呢&#xff1f; 2.3 怎么进行光标的快速移动&#xff1f; 2.4 复制粘贴操作 2.5 删除操作 三、编辑模式 四、命令行…

Java项目:SSM教师师资管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员与教师两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员角色登录,教师管理,教师授课管理,审批教师的项目开…

【前沿技术RPA】 一文了解UiPath 文件与文件夹自动化功能

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时也是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;UiPath &#x1f980;专栏简介&#xff1a;UiPath在传统的RPA&#xff08;Robotic…