• spring boot:接收数组参数及多文件混合json参数(spring boot 2.3.4)


    一,生产环境中的复杂参数上传的场景

    1,保存排序值 :

       例如:某一件商品的多张展示图片排序,提交的排序值要和图片的id相对应

     2,上传多张图片,图片要和指定的变量相对应

    例如:在添加商品sku时,

    需要为指定有图片的属性上传图片,

    让用户看上去更直观

     这里演示了这两种常见的参数上传,

    电商系统中的sku的添加是很关键的一个功能模块,

    必须让后台的操作人员能直观的看到自己的操作结果,

    这里有一些js代码可以供大家参考

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/

    说明:作者:刘宏缔 邮箱: 371125307@qq.com


    二,演示项目的相关信息

    1,项目地址:

    https://github.com/liuhongdi/arrayparam

    2,功能说明:

    演示了提交多个数组和提交多个数组变量及多个文件

    3,项目结构:如图:

    三,配置文件说明

    1,pom.xml

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--thymeleaf begin-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <!--validation begin-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
            </dependency>
            <!--commons-fileupload-->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>1.4</version>
            </dependency>
            <!--commons-io-->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.8.0</version>
            </dependency>
            <!--fastjson begin-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.73</version>
            </dependency>

    2,application.properties

    #thymeleaf
    spring.thymeleaf.cache=false
    spring.thymeleaf.encoding=UTF-8
    spring.thymeleaf.mode=HTML
    spring.thymeleaf.prefix=classpath:/templates/
    spring.thymeleaf.suffix=.html
    #error
    server.error.include-stacktrace=always
    #errorlog
    logging.level.org.springframework.web=trace

    四,java代码说明

    1,GoodsController.java

    @Controller
    @RequestMapping("/goods")
    public class GoodsController {
    
        //显示商品图片
        @GetMapping("/image")
        public String goodsimage(Model model,@Min(value = 1,message = "商品id需要>0")@RequestParam("goodsId") Long goodsId) {
    
            model.addAttribute("goodsId", goodsId);
            return "goods/image";
        }
    
        //保存各图片的排序值
        @PostMapping("/contentsaveorder")
        @ResponseBody
        public String goodsContentSaveOrder(HttpServletRequest request,
                                           @Min(value = 1,message = "商品id需要>0")@RequestParam("goodsId") Long goodsId,
                                                @RequestParam(value = "imgids[]") Long[] imgids,
                                                @RequestParam(value = "orders[]") int[] orders
        ) {
            String res = "当前商品id:"+goodsId+"
    ";
            for (int i = 0; i < imgids.length; i++) {
                Long imageId = imgids[i];
                int orderNum = orders[i];
                res += "当前图片id:"+imageId+";排序值:"+orderNum+"
    ";
            }
            return res;
        }
    
        //显示商品sku
        @GetMapping("/sku")
        public String sku(Model model,@Min(value = 1,message = "商品id需要>0")@RequestParam("goodsId") Long goodsId) {
            model.addAttribute("goodsId", goodsId);
            return "goods/sku";
        }
    
        //保存商品的sku
        @PostMapping("/skuadded")
        @ResponseBody
        public String skuadded(@RequestParam("json") String json,HttpServletRequest request) {
            SkuForm skuform = JSONObject.parseObject(json, SkuForm.class);
            String res = "goodsId:"+skuform.getGoodsId()+"
    ";
            for (Sku skuOne : skuform.getSkuList()) {
                res+="key:"+skuOne.getKey()+";price:"+skuOne.getPrice()+";stock:"+skuOne.getStock()+"
    ";
            }
            for (AttrType typeone :skuform.getTypeList()) {
                res+="typename:"+typeone.getTypeName()+";isimage:"+typeone.getIsImage()+";attrlist:"+typeone.getAttrList()+"
    ";
            }
            for (FormFile fileOne : skuform.getFileList()) {
                res+="filelist:fileName:"+fileOne.getFileName()+"
    ";
            }
            
            CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());
             // 判断是否是多数据段提交格式
            if (multipartResolver.isMultipart(request)) {
                System.out.println("isMultipart");
                MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
                Iterator<String> iter = multiRequest.getFileNames();
                Integer fileCount = 0;
                while (iter.hasNext()) {
                    MultipartFile multipartFile = multiRequest.getFile(iter.next());
                    String varName = multipartFile.getName();
                    String fileName = multipartFile.getOriginalFilename();
                    if(fileName == null || fileName.trim().equals("")){
                        continue;
                    } else {
                        res+="file:fileName:"+fileName+";varName:"+varName+"
    ";
                    }
                }
            } else {
                System.out.println("not isMultipart");
            }
           return res;
        }
    }

    2,SkuForm.java

    public class SkuForm {
    
        //goodsid
        private Long goodsId;
        public Long getGoodsId() {
            return this.goodsId;
        }
        public void setGoodsId(Long goodsId) {
            this.goodsId = goodsId;
        }
        
        //type list
        private List<AttrType> typeList;
        public List<AttrType> getTypeList() {
            return this.typeList;
        }
        public void setTypeList(List<AttrType> typeList) {
            this.typeList = typeList;
        }
        
        //sku list
        private List<Sku> skuList;
        public List<Sku> getSkuList() {
            return this.skuList;
        }
        public void setSkuList(List<Sku> skuList) {
            this.skuList = skuList;
        }
    
        //file list
        private List<FormFile> fileList;
        public List<FormFile> getFileList() {
            return this.fileList;
        }
        public void setFileList(List<FormFile> fileList) {
            this.fileList = fileList;
        }
    }

    3,AttrType.java

    public class AttrType {
        //typename
        private String typeName;
        public String getTypeName() {
            return this.typeName;
        }
        public void setTypeName(String typeName) {
            this.typeName = typeName;
        }
    
        //isImage
        private int isImage;
        public int getIsImage() {
            return this.isImage;
        }
        public void setIsImage(int isImage) {
            this.isImage = isImage;
        }
    
        //attr list
        private List<String> attrList;
        public List<String> getAttrList() {
            return this.attrList;
        }
        public void setAttrList(List<String> attrList) {
            this.attrList = attrList;
        }
    }

    4,Sku.java

    public class Sku {
        //key
        private String key;
        public String getKey() {
            return this.key;
        }
        public void setKey(String key) {
            this.key = key;
        }
    
        //price
        private String price;
        public String getPrice() {
            return this.price;
        }
        public void setPrice(String price) {
            this.price = price;
        }
    
        //stock
        private int stock;
        public int getStock() {
            return this.stock;
        }
        public void setStock(int stock) {
            this.stock = stock;
        }
    }

    5,FormFile.java

    public class FormFile {
        //fileName
        private String fileName;
        public String getFileName() {
            return this.fileName;
        }
        public void setFileName(String fileName) {
            this.fileName = fileName;
        }
    }

    五,html/js代码说明:

    1,image.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script type="text/javascript" language="JavaScript" src="/js/jquery-1.6.2.min.js"></script>
    </head>
    <body>
    <form id='content_order'>
    <div style='320px;background-color: #000000;font-size: 14px;height: 20px;color: #ffffff;text-align: center;line-height: 20px;'>商品详情</div>
    <div id="main" style="display: flex;flex-direction: column;">
    
    <div style=' 320px;'>
    <div style='150px;float:left;line-height: 0px;'><img src='/img/3.jpg' style=' 150px;' /></div>
    <div style='150px;float:left;'>
     图片id:3   <br/>
    排序值:<br/><input type='text' style='30px;' name='orderNum_3' value='' />
    </div>
    </div>
    
        <div style=' 320px;'>
            <div style='150px;float:left;line-height: 0px;'><img src='/img/4.jpg' style=' 150px;' /></div>
            <div style='150px;float:left;'>
                图片id:4   <br/>
                排序值:<br/><input type='text' style='30px;' name='orderNum_4' value='' />
            </div>
        </div>
    
        <div style=' 320px;'>
            <div style='150px;float:left;line-height: 0px;'><img src='/img/5.jpg' style=' 150px;' /></div>
            <div style='100px;float:left;'>
                图片id:5   <br/>
                排序值:<br/><input type='text' style='30px;' name='orderNum_5' value='' />
            </div>
        </div>
    </div> <!--main end-->
    </form>
    
    <input type="button" value="保存排序值" th:onclick="saveOrder([[${goodsId}]])" />
    
    <script>
        //保存排序值
        function saveOrder(goodsId){
            var form = document.getElementById("content_order");
            var tagElements = form.getElementsByTagName('input');
            var postdata = {};
            var imgids = [];
            var orders = [];
            for (var j = 0; j < tagElements.length; j++){
                var curid = tagElements[j].name.replace("orderNum_", "");
                imgids.push(curid);
                orders.push(tagElements[j].value);
            }
            postdata['imgids'] = imgids;
            postdata['orders'] = orders;
            postdata['goodsId'] = goodsId;
    
            $.ajax({
                type:"POST",
                url:"/goods/contentsaveorder",
                data:postdata,
                //返回数据的格式
                datatype: "text",//"xml", "html", "script", "json", "jsonp", "text".
                //成功返回之后调用的函数
                success:function(data){
                     alert(data);
                },
                //调用执行后调用的函数
                complete: function(XMLHttpRequest, textStatus){
                    //alert(XMLHttpRequest.responseText);
                    //alert(textStatus);
                },
                //调用出错执行的函数
                error: function(){
                    //请求出错处理
                    alert('error');
                }
            });
        }
    </script>
    </body>
    </html>

    2,sku.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script type="text/javascript" language="JavaScript" src="/js/jquery-1.6.2.min.js"></script>
    </head>
    <body>
    <form id='content_order'>
    <div id="main" style="display: flex;flex-direction: column;">
    <div>
    <input type="text" id="attrtype" name="attrtype" value="" />
        <input type="button" value="添加sku分类" onclick="addattrtype()">
    </div>
        <div id="attrlist" style="500px;background: #ffffff;overflow: hidden;">
        </div>
        <div id="skulist" style="500px;background: #ffffff;display: flex;flex-direction: column;overflow: hidden;">
        </div>
    </div> <!--main end-->
    </form>
    <input type="button" value="保存sku" th:onclick="savesku([[${goodsId}]])" />
    <script>
    
        //------------------------------------------------------------global var
        //分类列表
        var global_type = [];
        //分类1的属性列表
        var attr_list_0 = [];
        //分类2的属性列表
        var attr_list_1 = [];
    
        //-------------------------------------------------------------method
        //添加分类
        function addattrtype() {
            if (global_type.length >=2 ){
                alert("属性种类数量不能超过2类");
                return false;
            }
    
            var typename = document.getElementById('attrtype').value;
            if (global_type.indexOf(typename)>=0) {
                alert(typename+"已存在");
                return false;
            }
            if (typename == "") {
                alert("类别名称不可为空");
                return false;
            }
    
            global_type.push(typename);
            //addonetype(typename);
            var html = "<div id='type"+typename+"' style='background: #ffffff;500px;min-height:130px;'>" +
                "<div style='background: #eeeeee;text-align: left;height:30px;border-radius:5px;'>"+
                "<div style='float:left;margin-left:10px;'>"+typename+"<input id='checkimage"+typename+"' type='checkbox' onclick='checkimage(""+typename+"")'/>图片</div>" +
                "<div style='height:30px;float:right;'>" +
                "<input type='text' id='"+typename+"attrnew' value='' />" +
                "<input type='button' value='添加属性' onclick='addattr(""+typename+"")'/>" +
                "<input type='button' value='删除分类' onclick='delete_type(""+typename+"")'/>" +
                "</div></div>"+
                "<div id='"+typename+"attrlist' style='background: #ffffff;500px;min-height:100px;overflow:hidden;'>" +
                "</div>"+
                "</div>";
            //document.getElementById('attrlist').innerHTML += html;
            $("#attrlist").append(html);
        }
    
        //设置是否上传图片
        function checkimage(typename) {
            var ischecked = document.getElementById("checkimage"+typename).checked;
            alert(typename+":"+ischecked);
            if (ischecked == true) {
                for(i = 0; i < global_type.length; i++) {
                    //var curdispid = "dispup"+cur_attr_list[i];
                    //document.getElementById(curdispid).style.display="block";
                    if (global_type[i] == typename) {
                        continue;
                    } else {
                        var isotherchecked = document.getElementById("checkimage"+global_type[i]).checked;
                        if (isotherchecked == true) {
                            alert(global_type[i]+"已被选中使用图片,如果要设置"+typename+"使用图片请先把其他使用图片的分类取消");
                            document.getElementById("checkimage"+typename).checked = false;
                            return false;
                        }
                    }
                }
            }
    
            if (ischecked == true) {
                settypeimagetrue(typename)
            } else {
                settypeimagefalse(typename)
            }
        }
    
        //使一个分类下的attr支持上传图片
        function settypeimagetrue(typename) {
            var typeidx = global_type.indexOf(typename);
            var cur_attr_list;
            if (typeidx == 0) {
                cur_attr_list = attr_list_0;
            } else {
                cur_attr_list = attr_list_1;
            }
            for(i = 0; i < cur_attr_list.length; i++) {
                var curdispid = "dispup"+cur_attr_list[i];
                document.getElementById(curdispid).style.display="block";
            }
        }
    
        //使一个分类下的attr不支持上传图片
        function settypeimagefalse(typename) {
            var typeidx = global_type.indexOf(typename);
            var cur_attr_list;
            if (typeidx == 0) {
                cur_attr_list = attr_list_0;
            } else {
                cur_attr_list = attr_list_1;
            }
            for(i = 0; i < cur_attr_list.length; i++) {
                var curdispid = "dispup"+cur_attr_list[i];
                document.getElementById(curdispid).style.display="none";
                //清除图片
                document.getElementById("img"+cur_attr_list[i]).src="";
                document.getElementById("img"+cur_attr_list[i]).style.display="none";
                //清除file的选中文件
                document.getElementById("file"+cur_attr_list[i]).value='';
            }
        }
    
        //预览图片
        function preview(attrname) {
               var fileObj = document.getElementById("file"+attrname);
                var file=fileObj.files[0];
                var r = new FileReader();
                r.readAsDataURL(file);
            r.onload=function(e){
                document.getElementById("img"+attrname).src = e.target.result;
                document.getElementById("img"+attrname).style.display="block";
            }
        }
    
        //添加属性
        function addattr(typename) {
            var typeidx = global_type.indexOf(typename);
            var cur_attr_list;
            if (typeidx == 0) {
                 cur_attr_list = attr_list_0;
            } else {
                 cur_attr_list = attr_list_1;
            }
            var attrname = document.getElementById(typename+'attrnew').value;
            if (attr_list_0.indexOf(attrname)>=0) {
                alert(attrname+"已存在");
                return false;
            }
            if (attr_list_1.indexOf(attrname)>=0) {
                alert(attrname+"已存在");
                return false;
            }
    
            if (attrname == "") {
                alert("属性名称不可为空");
                return false;
            }
            cur_attr_list.push(attrname);
            var ischecked = document.getElementById("checkimage"+typename).checked;
            var imagetextdisp = "";
            if (ischecked == true) {
                imagetextdisp = "block";
            } else {
                imagetextdisp = "none";
            }
            var html = "<div id='attr"+attrname+"' style='margin-left:8px;margin-top:8px;80px;height:80px;line-height:80px;text-align:center;background: #eeeeee;float:left;border-radius:10px;position:relative;overflow:hidden;'>"+
                    "<img id='img"+attrname+"' src='' style='position:absolute;80px;height:80px;display: none;' />"+
                    "<div style='20px;height:20px;line-height:20px;background: #eeeeee;right:0px;position:absolute;text-align: center;' onclick='delete_attr(""+typename+"",""+attrname+"")'>x</div>"+
                "<div id='dispup"+attrname+"' style='80px;height:20px;opacity:0.9;line-height:20px;background: rgb(138, 138, 238);bottom:0px;position:absolute;text-align: center;display: "+imagetextdisp+";'>"+
                "<div style='position:relative;'>" +
                "<input type='file' name='file"+attrname+"' id='file"+attrname+"' onchange='preview(""+attrname+"")' style='position:absolute;z-index:100;80px;height:20px;left:0px;background: #ff0000;opacity:0;'/>"+
                "<div style='position: absolute;80px;height:20px;line-height:20px;opacity:0.9;font-size:12px;text-align:center;'>上传图片</div>"+
                "</div></div>"+
               attrname+
            "</div>";
            document.getElementById(typename+'attrlist').innerHTML += html;
            refresh_sku_list();
        }
    
        //删除分类
        function delete_type(typename) {
            if (confirm("确认删除分类:"+typename+"吗?") == false) {
                return false;
            }
            //清空数组
            var typeidx = global_type.indexOf(typename);
            if (typeidx == 0) {
                attr_list_0.length = 0;
                //如果删除的是第一个分类?
                attr_list_0 = attr_list_1.concat();
                attr_list_1.length = 0;
            } else {
                attr_list_1.length = 0;
            }
    
            //从type数组中删除
            var typeidx = global_type.indexOf(typename);
            global_type.splice(typeidx,1);
    
            //从div中删除
            $("#type"+typename).remove();
            //刷新sku
            refresh_sku_list();
        }
    
        //删除属性
        function delete_attr(typename,attrname) {
            if (confirm("确认删除属性:"+attrname+"吗?") == false) {
                return false;
            }
            var typeidx = global_type.indexOf(typename);
            //alert(typename+";idx:"+typeidx);
            var cur_attr_list;
            if (typeidx == 0) {
                cur_attr_list = attr_list_0;
            } else {
                cur_attr_list = attr_list_1;
            }
            //从数组中删除
            var attridx = cur_attr_list.indexOf(attrname);
            cur_attr_list.splice(attridx,1);
            //从div中删除
            $("#attr"+attrname).remove();
            //刷新sku
            refresh_sku_list();
        }
    
        //刷新sku列表
        function refresh_sku_list() {
            //只有一个为空
            if (attr_list_0.length == 0 && attr_list_1.length == 0) {
                document.getElementById('skulist').innerHTML = "";
            }
    
            if (attr_list_0.length > 0 && attr_list_1.length == 0) {
                var html = "<div style='border-radius:8px;margin-left:5px;490px;background:#eeeeee;'>"+
                    "<div style='padding-left:10px;200px;float:left;'>属性</div>"+
                    "<div style='100px;float:left;'>价格</div>"+
                    "<div style='100px;float:left;'>库存</div>"+
                    "</div>";
                document.getElementById('skulist').innerHTML = html;
                //
                //if (attr_list_0.length)
                var htmlattr= "<div style='border-radius:8px;margin-left:5px;margin-top:10px;490px;background:#eeeeee;display: flex;flex-direction: column;'>";
                for(i = 0; i < attr_list_0.length; i++) {
                    htmlattr += "<div>"+
                        "<div style='padding-left:10px;200px;float:left;'>"+attr_list_0[i]+"</div>"+
                        "<div style='100px;float:left;'><input type='text' name='price_'"+attr_list_0[i]+" value='0.00'></div>"+
                        "<div style='100px;float:left;'><input type='text' name='stock_'"+attr_list_0[i]+" value='0'></div>"+
                        "</div>";
                }
                htmlattr +="</div>";
                document.getElementById('skulist').innerHTML += htmlattr;
            }
    
            if (attr_list_0.length > 0 && attr_list_1.length > 0) {
                var html = "<div style='border-radius:8px;margin-left:5px;490px;background:#eeeeee;'>"+
                    "<div style='padding-left:10px;210px;float:left;'>属性</div>"+
                    "<div style='100px;float:left;'>价格</div>"+
                    "<div style='120px;float:left;'>库存</div>"+
                    "</div>";
                document.getElementById('skulist').innerHTML = html;
    
                //得到每大行高度
                var blockheight = attr_list_1.length*30;
                for(i = 0; i < attr_list_0.length; i++) {
                    var html = "<div style='background: #eeeeee;border-radius: 5px;margin-left:5px;margin-top:5px;490px;'>"+
                        "<div style='padding-left:10px;90px;float:left;height:"+blockheight+"px;line-height:"+blockheight+"px;'>"+attr_list_0[i]+"</div>"+
                        "<div style='380px;float:left;display: flex;flex-direction: column;'>";
    
                    for(j = 0; j < attr_list_1.length; j++) {
                        html += "<div style='400px;'><div style='100px;float:left;height:30px;line-height:30px;'>"+attr_list_1[j]+"</div>"+
                                "<div style='float:left;100px;'><input type='text' id='price_"+attr_list_0[i]+"_"+attr_list_1[j]+"' value='0.00'></div>"+
                                "<div style='float:left;100px;'><input type='text' id='stock_"+attr_list_0[i]+"_"+attr_list_1[j]+"' value='0'></div></div>";
                    }
                    html += "</div>"+
                        "</div>";
                    document.getElementById('skulist').innerHTML += html;
                }
            }
        }
    
        //提交sku的数据
        function savesku(goodsId) {
            //alert(goodsId);
            var postdata = {};
            postdata['goodsId'] = goodsId;
            var typelist = [];
            //得到两个分类
            for(i = 0; i < global_type.length; i++) {
                var typeobj = {"typeName":global_type[i]};
                var isotherchecked = document.getElementById("checkimage"+global_type[i]).checked;
                if (isotherchecked == true) {
                    typeobj["isImage"] = 1;
                } else {
                    typeobj["isImage"] = 0;
                }
    
                //得到下面的属性:
                var cur_attr_list;
                if (i == 0) {
                    cur_attr_list = attr_list_0;
                } else {
                    cur_attr_list = attr_list_1;
                }
                var attrlist=[];
                for(j = 0; j < cur_attr_list.length; j++) {
                    attrlist.push(cur_attr_list[j]);
                }
                typeobj['attrList'] = attrlist;
    
                //typeobj
                typelist.push(typeobj);
            }
    
            postdata["typeList"] = typelist;
    
            //遍历sku:
            var skulist = [];
            for(i = 0; i < attr_list_0.length; i++) {
                for(j = 0; j < attr_list_1.length; j++) {
                    var key = attr_list_0[i]+"_"+attr_list_1[j];
                    var price = document.getElementById('price_'+key).value;
                    var stock = document.getElementById('stock_'+key).value;
                    var skuone = {"key":key,"price":price,"stock":stock};
                    skulist.push(skuone);
                }
            }
    
            postdata["skuList"] = skulist;
    
            var filelist = [];
            var cur_attr_list;
            if (i == 0) {
                cur_attr_list = attr_list_0;
            } else {
                cur_attr_list = attr_list_1;
            }
            for(i = 0; i < global_type.length; i++) {
                var typeobj = {"typename": global_type[i]};
                var isotherchecked = document.getElementById("checkimage" + global_type[i]).checked;
                if (isotherchecked == true) {
                    if (i == 0) {
                        cur_attr_list = attr_list_0;
                    } else if (i == 1) {
                        cur_attr_list = attr_list_1;
                    }
                }
            }
            //var postdatafile = {};
            var postdatafile=new FormData();
            //
            for(i = 0; i < cur_attr_list.length; i++) {
                var fileid = "file"+cur_attr_list[i];
                if ("undefined" == typeof($("#"+fileid)[0].files[0])) {
                    continue;
                } else {
                    //
                    var fileobj = {"fileName":cur_attr_list[i],"file":$("#"+fileid)[0].files[0]};
                    postdatafile.append(["file_"+cur_attr_list[i]],$("#"+fileid)[0].files[0]);
                    filelist.push(fileobj);
                }
            }
            postdata["fileList"] = filelist;
            console.log(postdata);
    
            var postdatajson = {};
            //postdatafile['json'] = JSON.stringify(postdata);
            postdatafile.append("json",JSON.stringify(postdata));
            console.log(postdatafile);
            alert("begin ajax");
            $.ajax({
                type:"POST",
                url:"/goods/skuadded",
                data:postdatafile,
                //返回数据的格式
                datatype: "text",//"xml", "html", "script", "json", "jsonp", "text".
                processData:false, // 将数据转换成对象,不对数据做处理,故 processData: false
                contentType:false,    // 不设置数据类型
                //成功返回之后调用的函数
                success:function(data){
                    alert(data);
                },
                //调用执行后调用的函数
                complete: function(XMLHttpRequest, textStatus){
                    //alert(XMLHttpRequest.responseText);
                    //alert(textStatus);
                },
                //调用出错执行的函数
                error: function(){
                    //请求出错处理
                    alert('error');
                }
            });
        }
    </script>
    </body>
    </html>

    六,测试效果

    1,测试提交排序值:

    访问:

    http://127.0.0.1:8080/goods/image?goodsId=2

    如图:

     服务端能正确接收到图片id和提交的图片的排序值

    2,测试提交创建商品sku:

    访问:

    http://127.0.0.1:8080/goods/sku?goodsId=2

    如图:

    可以看到服务端可以接收到属性对应的图片文件和属性的对应关系,以及sku的价格库存信息

    七,查看spring boot版本

      .   ____          _            __ _ _
     /\ / ___'_ __ _ _(_)_ __  __ _    
    ( ( )\___ | '_ | '_| | '_ / _` |    
     \/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.3.4.RELEASE)
  • 相关阅读:
    销售排行榜
    视频合并的问题
    全排列的问题
    24点的游戏
    分数拆分
    竖式
    MVVM
    package
    WP8.1APP执行流程
    W
  • 原文地址:https://www.cnblogs.com/architectforest/p/13754805.html
Copyright © 2020-2023  润新知