Spring MVC-Ajax文件上传不起作用

时间:2019-03-09 11:06:52

标签: java ajax spring spring-mvc

我正在尝试使用AJAX和Spring MVC动态上传文件。

这是我在做什么:

JavaScript函数:

function initQwacCertificate(){
  $('#qwac').on('change', function(){
      var formData = new FormData();
      var file = $('#qwac')[0].files[0];

      formData.append("myFileKey", file);

      $.ajax({
          url : postQwac,
          type : 'POST',
          data : formData,
          enctype : 'multipart/form-data',
          contentType : false,
          cache : false,
          processData : false,
          success : function(response) {},
      });
  });
};

Java控制器:

@PostMapping(value = "/extractQwacCertificate", consumes = { "multipart/form-data" })
        ExtractedQwacCertificate extractQwacCertificate(@RequestParam("myFileKey") MultipartFile uploadedFile) throws IOException, CertificateException {
            //MyStuff
}

所有这些东西在我的JS控制台中返回了我不明白的400错误:

所需的请求部分“ myFileKey”不存在

但是对我来说,这个“ myFileKey”存在!我做错了什么,但我不知道该怎么办!有人看到错了吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您可能没有注册StandardServletMultipartResolver(或Servlet 3.0之前的CommonsMultipartFile)。如果没有MultipartResolver,Spring将不知道如何从请求中提取文件。

对于Servlet 3.0,您需要将其添加到调度程序Servlet中:

public class MainWebAppInitializer implements WebApplicationInitializer {

    private String TMP_FOLDER = "/tmp"; 
    private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; 

    @Override
    public void onStartup(ServletContext sc) throws ServletException {

        ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(
          new GenericWebApplicationContext()));

        appServlet.setLoadOnStartup(1);

        MultipartConfigElement multipartConfigElement = new MultipartConfigElement(TMP_FOLDER, 
          MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2);

        appServlet.setMultipartConfig(multipartConfigElement);
    }
}

然后注册多部分解析器(给出了Java配置示例):

@Bean
public StandardServletMultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
}