spring通过ajax提交文件,并同时上传其他的参数,使用 FormData 提交,java后端接受使用新的 request

FormData 的使用,和通过 ajax 上传附件,后端使用MultipartHttpServletRequest接受;

api:

构造函数

FormData()
创建一个新的 FormData 对象。

方法

FormData.append()
向 FormData 中添加新的属性值,FormData 对应的属性值存在也不会覆盖原值,而是新增一个值,如果属性不存在则新增一项属性值。
FormData.delete()
从 FormData 对象里面删除一个键值对。
FormData.entries()
返回一个包含所有键值对的iterator对象。
FormData.get()
返回在 FormData 对象中与给定键关联的第一个值。
FormData.getAll()
返回一个包含 FormData 对象中与给定键关联的所有值的数组。
FormData.has()
返回一个布尔值表明 FormData 对象是否包含某些键。
FormData.keys()
返回一个包含所有键的iterator对象。
FormData.set()
给 FormData 设置属性值,如果FormData 对应的属性值存在则覆盖原值,否则新增一项属性值。
FormData.values()
返回一个包含所有值的iterator对象。

学习示例:

一、创建formData对象

1、创建一个空对象:

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//可以通过append()方法来追加数据
formdata.append("name","laotie");
//通过get方法对值进行读取
console.log(formdata.get("name"));//laotie
//通过set方法对值进行设置
formdata.set("name","laoliu");
console.log(formdata.get("name"));//laoliu

2、通过表单对formData进行初始化

创建表单

<form id="advForm">
    <p>广告名称:<input type="text" name="advName"  value="xixi"></p>
    <p>广告类别:<select name="advType">
        <option value="1">轮播图</option>
        <option value="2">轮播图底部广告</option>
        <option value="3">热门回收广告</option>
        <option value="4">优品精选广告</option>
    </select></p>
    <p><input type="button" id="btn" value="添加"></p>
</form>

通过表单元素作为参数,实现对formData的初始化:

//获得表单按钮元素
var btn=document.querySelector("#btn");
//为按钮添加点击事件
btn.onclick=function(){
    //根据ID获得页面当中的form表单元素
    var form=document.querySelector("#advForm");
    //将获得的表单元素作为参数,对formData进行初始化
    var formdata=new FormData(form);
    //通过get方法获得name为advName元素的value值
    console.log(formdata.get("advName"));//xixi
    //通过get方法获得name为advType元素的value值
    console.log(formdata.get("advType"));//1 
}

二、操作方法

1、通过 get(key) 与 getAll(key) 来获取相对应的值

// 获取key为age的第一个值
formdata.get("age"); 
 // 获取key为age的所有值,返回值为数组类型
formdata.getAll("age");

2、通过append(key,value)在数据末尾追加数据

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
//通过append()方法在末尾追加key为name值为laoli的数据
formdata.append("name","laoli");
//通过append()方法在末尾追加key为name值为laotie的数据
formdata.append("name","laotie");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoliu
//通过getAll方法读取key为name的所有值
console.log(formdata.getAll("name"));//["laoliu", "laoli", "laotie"]

3、通过set(key, value)来设置修改数据

key的值不存在,会添加一条数据

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//如果key的值不存在会为数据添加一个key为name值为laoliu的数据
formdata.set("name","laoli");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoli

key的值存在,会修改对应的value值

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
//通过append()方法在末尾追加key为name值为laoliu2的数据
formdata.append("name","laoliu2");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoliu
//通过getAll方法读取key为name的所有值
console.log(formdata.getAll("name"));//["laoliu", "laoliu2"]

//将存在的key为name的值修改为laoli
formdata.set("name","laoli");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoli
//通过getAll方法读取key为name的所有值
console.log(formdata.getAll("name"));//["laoli"]

4、通过has(key)来判断是否存在对应的key值

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
//判断是否包含key为name的数据
console.log(formdata.has("name"));//true
//判断是否包含key为age的数据
console.log(formdata.has("age"));//false

5、通过delete(key)可以删除数据

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
console.log(formdata.get("name"));//laoliu
//删除key为name的值
formdata.delete("name");
console.log(formdata.get("name"));//null

使用示例:

前端代码:

不使用 form 提交,而是用 ajax

<input id="J_photo1" type="file" data-image="fileInput" accept="image/*;" capture="camera" multiple>
$(".submit-button").click(function () {
            var $input = $('#fileInput');
            // 相当于: $input[0].files, $input.get(0).files
            var files = $input.prop('files');
            var data = new FormData();
            var obj = {};
            obj.childCount = $("#childCount").val();
            $.each(files, function (idx, val) {
                /**;
                 * 向 FormData 中添加新的属性值,FormData 对应的属性值存在也不会覆盖原值,而是新增一个值,如果属性不存在则新增一项属性值。
          * 后端多个的情况下,需要使用结合获取
          * 如果直接将 files 放进去,会被识别的一个字符串 *
*/ data.append('file', val); });
       /**
        * 其他的参数封装成一个 obj,后台接受后进行转换即可
        **/
data.append(
"paramObj", JSON.stringify(obj)); $.ajax({ url: '/xxx/yyy', type: 'POST', data: data, dataType: 'JSON', cache: false, processData: false, contentType: false, success: function(data){ if (data.success){ console.log("我成功了") }else { console.log(data.msg) } } }); });

后端代码:

使用 spring 上传附件需要引入新的包:

        <!--引入附件上传组件-->
        <dependency>
            <groupId>com.tuniu.operation.platform</groupId>
            <artifactId>base-io</artifactId>
            <version>0.5.0</version>
        </dependency>
        <!--引入上传文件依赖-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!--引入上传文件依赖end-->

mvc中引入配置:

    <!--引入附件上传-->
    <beans:bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="defaultEncoding" value="UTF-8" />
        <beans:property name="maxUploadSize" value="104857600" />
    </beans:bean>
    <!--引入附件上传end-->

java 后端接受formData使用MultipartHttpServletRequest:

    public void updateResDetail(HttpServletRequest request, HttpServletResponse response) {
        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
        //获取file集合
        List<MultipartFile> multipartFiles = multipartHttpServletRequest.getFiles("file");
        List<FileVo> list = this.uploadFileList(multipartFiles);
        //其他的参数消息体
        String requestParam = multipartHttpServletRequest.getParameter("paramObj");
    }

官网地址:

https://developer.mozilla.org/zh-CN/docs/Web/API/FormData

参考:

https://blog.csdn.net/weixin_43352901/article/details/109304558

原文地址:https://www.cnblogs.com/lzghyh/p/15166478.html