欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

将form表单提交文件修改为ajax提交

程序员文章站 2022-06-15 20:22:19
...

好久没有记录工作中的出现的问题了,不过最近客户提出了新的需求,正好弥补了一下我的短板,学到了新的知识。

周一接到客户电话,要求完善上周写的某个功能--就是同时上传多个图片,并通过接口程序传到第三方系统。上周的修改由于是同事告诉我的需求,并不是很明确,所以需要重新修改一下。

客户提的需求是,将原来后台生成的文件直接传到第三方的功能修改为页面上传文件(图片或PDF),所以需要修改的地方比较多;例如,将原来后台生成PDF的功能代码去掉,在页面添加上传文件的代码,js 中增加上传文件的判断等等。今天主要说的就是在融合代码时,将原来的form表单提交文件修改为ajax提交后台数据的方式。代码如下:

前端jsp:

<%-- <form name="downloadForm" id="downloadForm" action="" method="post"  target="_self"  enctype="multipart/form-data" > --%>

<div>

     <jsp:include page="../csrf.jsp"/>

           <input type="file" style="font-size:14px;color:inherit;"size="30" class="input1 js-upload" name="myfiles"  id="myfiles" multiple="multiple" contenteditable="false" onChange="checkFile(this,'file')" />

            <font id="imgStyle">(请上传格式为"jpg,png,pdf"的附件,文件大小不得超过10MB)</font>

            <br />

            <!-- <input   type="button" class="button2" value= "上传定标审批表"  id="uploading"  onclick="uploadRecord()"/> -->

            <div class="confirmOaBox" style="padding:30px;">

                 <input name="submitExamine" type="button" id="button_a" value="" class="button2" onclick="提交的方法();"/>

           </div>

</div> 

<!-- </form> -->

从上边代码可以看出将原来的form表单改成了普通提交方式。

js代码:

//验证上传的图片文件格式 2020-10-11
function checkFile(obj,type){
    var fileStyle=obj.value.substring(obj.value.lastIndexOf(".")+1);
    if(type == 'file'){
            if(fileStyle !='jpg' && fileStyle != 'png' &&fileStyle!='pdf'){
                scscms_alert("请上传格式为'jpg,png,pdf'的文件",'warn');
                $("#myfiles").val("");
            }
        }
    //获取文件大小
    var fileSize = obj.files[0].size
     if(fileSize>10000*1024){
        scscms_alert("请上传小于10M的文件",'warn');
        $("#myfiles").val("");
    } 
}

以上代码为验证上传文件的方法

提交方法的代码:

var myfiles = $("input[name='myfiles']").val();
    if(myfiles ==null || myfiles == ''){
        scscms_alert("请先上传******文件!",'warn');
        return false;
    }

var form = new FormData();

    //获取需要传到后台的文件
    var files = document.querySelector('.js-upload').files
    var num = files.length
    for (var i = 0; i<num; i++) {
        form.append("file", files[i], files[i].name); // 文件对象
    };
    //需要提交到后台的其他数据
    //form.append('multilevelExamine',2);
    //form.append('evaluaOpinion',evaluaOpinion);
    //form.append('CSRFToken',"");
    scscms_alert('提交后数据不可修改,确定提交吗?','confirm',function(){
        $('#RotatingLoading').show();
        //保存数据
        $.ajax({
              type: "POST",
              url: 后台地址,
              data:form,
              cache: false, // 不缓存
              processData: false, // jQuery不要去处理发送的数据
              contentType: false, // jQuery不要去设置Content-Type请求头
              dataType:'json',
              success: function(msg){
                  if(msg.result==1){
                      scscms_alert('提交成功!','success',function(){
                          location.reload();
                      });    
                  }else{
                      scscms_alert('操作失败!'+msg.resultTxt,'warn',function(){
                      });    
                  }
               }
        })
    },function(){
        $('#RotatingLoading').hide();
        console.log('取消')
    });

以上是ajax提交后台的代码

后台代码:

@ResponseBody
    @RequestMapping(value = "")
    public void updateMultilevelExamineOA(@RequestParam("file") MultipartFile[] myfiles,String evaluaOpinion,
            HttpServletRequest request, RedirectAttributes attr, HttpSession session, HttpServletResponse response)
                    throws Exception {
        中间内容照常,业务代码,与本次修改无关。
}

以上就是form表单上传文件修改为ajax方式上传文件的改造代码,主要是为了迎合业务上的需求,同时满足与当前代码的高度融合。中间出现问题的地方没有时间截图,可以直接使用上述代码一次成功。

需要注意的是:提交方法的代码中form.append("file", files[i], files[i].name)和后台代码中@RequestParam("file") MultipartFile[] myfiles,两处标红的的属性名必须是一样的,否则会报错!这个问题本来一次能成功的我耽误了挺长时间才找到的原因。

最后感谢公司前端的同事帮忙一起处理的这个问题,这个项目不是前后端分离的,友情协助!