【问题标题】:Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest]当前请求的类型不是 [org.springframework.web.multipart.MultipartHttpServletRequest]
【发布时间】:2017-12-29 15:46:35
【问题描述】:

我正在尝试使用以下方式上传文件。但我收到 java.lang.IllegalStateException: Current request is not type [org.springframework.web.multipart.MultipartHttpServletRequest]: org.apache.catalina.connector.RequestFacade@1b04024.

当我调用 form.submit();而不是 form.submit(function(){ 使用 ajax 调用它按预期工作。但我需要从 Spring 控制器返回一个字符串值并进入 JS 函数。下面的代码确实有效。

Angularjs 函数:

    function fnSubmitUploadForm(formData){
        var iframe = $('<iframe name="postiframe" id="postiframe" style="display: none"></iframe>');
        $("body").append(iframe);
        var form = $('#upload');
        form.attr("action", CONTEXT_PATH+"/uploadFile");
        form.attr("method", "post");
        form.attr("encoding", "multipart/form-data");
        form.attr("enctype", "multipart/form-data");
        form.attr("target", "postiframe");
        form.attr("uploadfile", $('#uploadfile').val());
        var input =  $('<input type="hidden" name="filename"/>').val(formData);
        input.appendTo(form);

        form.submit(function(){
            $.ajax({
              url: form.attr('action'),
              type: 'POST',
              data : form.serialize(),
              success: function(){
                alert('form submitted.');
              }
            });
            return false;
        });
    }

弹簧控制器方法:

    @RequestMapping(value="/uploadFile", method=RequestMethod.POST) 
    public @ResponseBody String uploadFile(MultipartHttpServletRequest request, HttpServletResponse response){  
        try{
            MultipartFile file =(MultipartFile) request.getFile("uploadfile");
            String[] formData=request.getParameterValues("filename");

        }   
    }   

【问题讨论】:

    标签: javascript java angularjs spring-mvc multipartform-data


    【解决方案1】:

    原因是你在js提交中使用了表单序列化,它无法序列化文件类型等表单属性!看看这个链接: FormData vs .serialize(), What is the difference?

    【讨论】:

    • var formData = new FormData(form);数据:formData,当我尝试这个时,我得到 jquery.min.js:4 Uncaught TypeError: Illegal invocation..
    • 尝试:新的 FormData(form.get(0))
    • 抱歉给你添麻烦了.. var formData1 = new FormData(form.get(0));我也遇到了同样的例外..
    • 尝试在您的 ajax 请求中添加 $.ajax{ processData: false, contentType: false} 吗?
    • 不客气~很高兴你能解决它。请多做一点接受我的回答!
    【解决方案2】:

    我已经通过下面的代码解决了这个问题。

    form.submit(function(){
        var formData1 = new FormData($(this)[0]);
        $.ajax({
            url: form.attr('action'),
            type: 'POST',
            data: formData1,
            async: false,
            cache: false,
            contentType: false,
            processData: false,
            success: function(){
                alert('form submitted.');
            }
        });
        return false;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      相关资源
      最近更新 更多