【问题标题】:Spring boot: The request was rejected because no multipart boundary was found in spring boot with ajax call?Spring boot:请求被拒绝,因为在带有ajax调用的spring boot中没有找到多部分边界?
【发布时间】:2019-06-22 19:41:29
【问题描述】:

我正在使用 Spring Boot。我想使用 AJAX 调用上传文件和一些数据。但是,当我输入数据,选择文件,然后单击提交按钮时,出现以下异常:

org.apache.tomcat.util.http.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界

<form  id="course-form" enctype="multipart/form-data">
  <input type="text" class="form-control" placeholder="Course Name" name="courseName" id="courseName">
  <input type="text" class="form-control" placeholder="Total no of sets" name="noOfSets" id="noOfSets">
  <input type="text" class="form-control" placeholder="Total fees" name="fees" id="fees">
  <input type="file" class="form-control" placeholder="Select an image" name="image" id="image">
  <input type="text" name="requirements" id="requirements" class="form-control">
  <input type="text" name="requirements" id="requirements" class="form-control">
  <input type="button" value="Add more requirements" id="add-req">
  <input type="submit" value="Submit">
</form>

ajax 调用

function saveCourse(){
             var itemData=new FormData($("#courseForm")[0]);
            $.ajax({
                type : "POST",
                url : "/course/save",
                data : itemData,
                async: false,
                processData : false,
                cache : false,
                contentType : 'multipart/form-data',
                success : function(result) {
                    if(result.message !=null){
                    alert(result.message);
                    }
                },
                error : function(e){
                    alert("Error! Please enter proper data");
                }
            });
            return false;
        }

控制器类

@PostMapping(value="/course/save")
public ResponseDTO addCourse(MultipartHttpServletRequest request, CourseDTO courseDTO) 
{
  System.out.println("Course controller save menthod started");
  return null;
}

为什么我会收到此异常?还有,我该如何解决这个问题?

【问题讨论】:

  • 这个Old post 似乎很相关
  • 不应该 $("#courseForm") 改为 $("#course-form") 吗?
  • 没有表单标签的id是courseForm

标签: javascript jquery html ajax spring-boot


【解决方案1】:

看来你没有设置 enctype 并且应该明确设置 contentType: false,:

function saveCourse() {
  var form = $('#course-form')[0];
  var courseData = new FormData(form);
  $.ajax({
    type : "POST",
    url : "/course/save",
    contentType: false,
    data: courseData,
    processData: false,
    success: function(result) {
      if (result.message != null) {
        alert(result.message);
      }
    },
    error: function(e) {
      alert("Error! Please enter proper data");
    }
  });
  return false;
}

通过省略它,浏览器将负责生成具有多部分边界的正确内容类型,例如:

content-type: multipart/form-data; boundary=----WebKitFormBoundaryQ0pBuvRC1EzDAQWT````

【讨论】:

  • 我已经明确定义我已经编辑了代码 contentType : 'multipart/form-data',
  • 什么意思?您是否提供了最终的多部分内容类型?你是怎么计算的?我不认为你能做到,这就是为什么你会取消它并让浏览器做它的事情。
  • 我将 contentType 设置为 false 但仍然收到以下错误 java.lang.IllegalStateException: Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest]: ServletWebRequest: uri=/course /save;client=0:0:0:0:0:0:0:1
【解决方案2】:

问题已通过以下 ajax 代码解决

 var itemData=new FormData($("#courseForm")[0]);
        $.ajax({
            type : "POST",
            url : "/course/save",
            data : itemData,
            dataType : "json"
            processData : false,
            cache : false,
            contenttype : false;
            success : function(result) {
                if(result.message !=null){
                alert(result.message);
                }
            },
            error : function(e){
                alert("Error! Please enter proper data");
            }
        });
        return false;

我们需要使用@RequestParam注解获取控制器中的数据,使用@RequestPart注解获取文件

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 2013-07-02
    • 2019-03-18
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2020-08-27
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多