• 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

  • 相关阅读:
    关于Git的一些常规操作
    .Net 常用ORM框架对比:EF Core、FreeSql、SqlSuger (下篇)
    Myeclipse打开许多JSP文件或者js文件之后非常卡-------的解决办法
    单点登录常用生成token的操作-----UUID.randomUUID().toString() 简介
    如何使用时间复杂度和空间复杂度来区分算法的效率?
    自定义注解的简单使用
    企业中常用的Git和Svn比较。
    框架中常见的注解分析
    处理大数据流常用的三种Apache框架:Storm、Spark和Samza。(主要介绍Storm)
    养生食谱
  • 原文地址:https://www.cnblogs.com/lzghyh/p/15166478.html
Copyright © 2020-2023  润新知