Spring MVC - загрузка файла Ajax не работает - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь загрузить файл динамически, используя 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
}

Все это возвращает мне ошибку 400 в моей консоли JS, которую я не могу понять:

Обязательная часть запроса 'myFileKey' отсутствует

Но для меня этот myFileKey присутствует! Есть что-то, что я делаю неправильно, но я не знаю что! Кто-нибудь видит, что не так?

Спасибо

1 Ответ

1 голос
/ 10 марта 2019

Возможно, вы не зарегистрированы StandardServletMultipartResolver (или CommonsMultipartFile до сервлета 3.0).Без MultipartResolver Spring не знает, как извлечь файл из запроса.

Для сервлета 3.0 вам нужно добавить это в ваш сервлет диспетчера:

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);
    }
}

И затем зарегистрировать составную частьresolver (приведен пример конфигурации Java):

@Bean
public StandardServletMultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...