JAVA: Загрузить составной файл

Я борюсь с загрузкой файлов Multipart в контроллере Spring. Я прочитал несколько вопросов, погуглил, но, похоже, ничего не работает.

я получил

error: "Bad Request"
exception: "org.springframework.web.multipart.support.MissingServletRequestPartException"
message: "Required request part 'file' is not present"

Мой контроллер BE:

@RequestMapping(value = "/zip", method = RequestMethod.POST)
public void readFile(@RequestParam("file") MultipartFile file) throws IOException { 
// code
}

FE, angularJS:

service.getZip = function getZip(file) {
    var formData = new FormData();
    formData.append('file', file);
    return $http({
        method: 'POST',
        url: CONSTANTS.readFile,
        data: formData,
        headers: {'Content-Type': undefined}
    }) .then(function (response) {
        var data = response.data;
        return data.id;
    });
}

HTML:

<input type = "file" id = "file" name = "file" accept = ".txt"/>

также application.properties содержат:

spring.http.multipart.enabled=false

Обновлено:

Я больше не получаю эту ошибку, когда следую совету @ Byeon0gam по удалению @RequestParam с моего контроллера, но мой файл имеет значение null, поскольку это касается контроллера. Хотя в сервисе FE, как я вижу, не пусто:

JAVA: Загрузить составной файл

Вы уверены, что не смешиваете логику загрузки и выгрузки? У вас есть сопоставление Post с методом readFile. Вы также используете url: CONSTANTS.readFile. Вы хотите загрузить файл с клиента на сервер или загрузить файл с сервера на клиент?

user10367961 03.10.2018 20:27

Я хочу и то, и другое - загрузить файл от клиента и сразу же вернуть ответ, состоящий из файлов, сгенерированных из загруженного файла.

cinnamon 03.10.2018 20:36

Я не знаю angularJS, поэтому не знаю, какой запрос генерируется из этого кода. НО: вы можете создать стандартную HTML-форму с помощью кнопки ОТПРАВИТЬ. Контроллеры Spring без проблем работают с загрузкой файлов HTML. Итак, если это сработает, запустите консоль разработчика и проверьте точный запрос запроса, который отправляется, когда вы нажимаете кнопку отправки. Затем поиграйте с кодом JS, пока он не создаст точно такой же запрос.

Selindek 03.10.2018 22:29

добавьте в форму этот enctype = "multipart / form-data".

tharanga-dinesh 04.10.2018 10:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
682
1

Ответы 1

измените Content-Type в вашем FE на:

headers: {'Content-Type': 'x-www-form-urlencoded'}

надеюсь, это сработает для вас.

то я получаю ошибку message: "Current request is not a multipart request"

cinnamon 03.10.2018 20:33

попробуйте добавить enctype = 'multipart / form-data' в $ http

user9968195 03.10.2018 20:37

он все еще говорит message: "Current request is not a multipart request"

cinnamon 03.10.2018 20:42

Попробуйте удалить строку content-type в $ http.

user9968195 03.10.2018 20:59

еще "Current request is not a multipart request". Похоже на магию

cinnamon 03.10.2018 21:02
stackoverflow.com/questions/42013087/…
user9968195 03.10.2018 21:10

Другие вопросы по теме