Загрузить файл из AngularJS в Spring Boot - PullRequest
0 голосов
/ 22 апреля 2020

Я использую AngularJS, чтобы сделать мой интерфейс, и Java с Spring Boot, чтобы сделать мой бэкэнд. Я пытаюсь импортировать / загрузить файл xlsx, xls или ods из Angular в мой Java, но что бы я ни делал, запрос не отправляет мой файл!

Java конечная точка:

@PostMapping(value = "/upload/{type}")
@ResponseBody
private ResponseEntity<List<Rota>> importFile(@PathVariable("type") String type,
                                              @RequestParam(required = false, value = "file") MultipartFile fileParam, 
                                              @RequestBody MultipartFile  file) {
    System.out.println("File: " + file.getName());
    if(type.toUpperCase().equals("XLSX")){
        System.out.println("XLSX!");
    }else if(type.toUpperCase().equals("XLS")){
        System.out.println("XLS!");
    }else if(type.toUpperCase().equals("ODS")){
        System.out.println("ODS!");
    }else{
        System.out.println("OPS!");
        return new ResponseEntity<>(new ArrayList<>(), HttpStatus.UNSUPPORTED_MEDIA_TYPE);
    }
    return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK);
}

Мой идентификатор запроса сделан с использованием класса Angular, подготовленного только для выполнения запросов. Я опубликую здесь код, который мы обычно используем в проекте, и код, который действительно работал, но я не могу его использовать.

DataFactory:

DataFactory.POST = function (url, entity, config = null) {
  if (url && entity) {
    return $http
      .post(url, entity, config)
      .then(res => $q.resolve(res.data), error => $q.reject(error));
  }
};

Код, который действительно работал :

var xhr = new XMLHttpRequest;
xhr.open('POST', `${URL.CTM_ODS()}/rotas/upload/${type}`, true);
xhr.send(formData);

Когда я использую Postman, отправляя файл через тело, серверная часть получает нулевое значение, но когда я использую данные формы из Postman, работает нормально! Используя DataFactory, я получил следующий стек на своей стороне:

WARN 16796 --- [p1002886236-126] org.eclipse.jetty.http.HttpParser        : badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@78fd8670{r=2,c=false,a=IDLE,uri=}

1 Ответ

0 голосов
/ 22 апреля 2020

Нашел ответ в этом видео: https://www.youtube.com/watch?v=vLHgpOG1cW4 Моя проблема заключалась в том, что AngularJS десериализовал файл! Итак, что я сделал, так это просто поместил объект конфигурации, говорящий, что он этого не делает:

DataFactory.POST(`${URL.CTM_ODS()}/rotas/upload/${type}`, formData, { transformRequest: angular.indentity, headers: { 'Content-Type': undefined } }).then(response => {
    delete vm.importacao.arquivoCsv;
    console.log('Response: ', response);
    LoadingManager.hide();
  });

Как вы можете видеть, разница в объекте заголовка, вы можете видеть, что мы передаем тип содержимого как неопределено и transformRequest: angular.indentity? Это сработало для меня! Если у кого-то есть другой способ сделать это, не стесняйтесь комментировать! Спасибо и хорошего дня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...