Подтвердить что ты не робот

Spring Запрос на мультипроцессор MVC с JSON

Я хочу отправить файл с некоторыми данными JSON, используя spring MVC. Таким образом, разработаны службы отдыха как

@RequestMapping(value = "/servicegenerator/wsdl", method = RequestMethod.POST,consumes = { "multipart/mixed", "multipart/form-data" })
@ResponseBody
public String generateWSDLService(@RequestPart("meta-data") WSDLInfo wsdlInfo,@RequestPart("file") MultipartFile file) throws WSDLException, IOException,
        JAXBException, ParserConfigurationException, SAXException, TransformerException {
    return handleWSDL(wsdlInfo,file);
}

Когда я отправляю запрос от клиента отдыха с content-Type = multipat/form-data или multipart/mixed

Я становлюсь ниже ошибки org.springframework.web.multipart.support.MissingServletRequestPartException

Может ли кто-нибудь помочь мне в решении этой проблемы?

Можно ли использовать RequestPart для отправки как Multipart, так и Json на сервер?

4b9b3361

Ответ 1

Вот как я реализовал Spring MVC Multipart Request с данными JSON.

Многостраничный запрос с данными JSON (также называемый Mixed Multipart):

На основе службы RESTful в Spring 4.0.2 Release, HTTP-запрос с первой частью с форматированными данными XML или JSON, а вторая часть с файлом может быть достигнута с помощью @RequestPart.Below - это пример реализации.

Java Snippet:

Служба останова в контроллере будет иметь смешанные @RequestPart и MultipartFile для обслуживания такого запроса Multipart + JSON.

@RequestMapping(value = "/executesampleservice", method = RequestMethod.POST,
    consumes = {"multipart/form-data"})
@ResponseBody
public boolean executeSampleService(
        @RequestPart("properties") @Valid ConnectionProperties properties,
        @RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file) {
    return projectService.executeSampleService(project, file);
}

Фрагмент (JavaScript) Фрагмент:

  • Создайте объект FormData.

  • Приложите файл к объекту FormData, используя один из следующих шагов.

    • Если файл был загружен с использованием элемента ввода типа "файл", добавьте его в объект FormData. formData.append("file", document.forms[formName].file.files[0]);
    • Непосредственно добавьте файл в объект FormData. formData.append("file", myFile, "myfile.txt"); OR formData.append("file", myBob, "myfile.txt");
  • Создайте blob с строковыми данными JSON и добавьте его в объект FormData. Это приводит к тому, что Content-type второй части в многопрофильном запросе будет "application/json" вместо типа файла.

  • Отправьте запрос на сервер.

  • Детали запроса: я. Content-Type: undefined Это заставляет браузер устанавливать Content-Type в multipart/form-data и правильно заполнять границу. Ручная настройка Content-Type для multipart/form-data не сможет заполнить граничный параметр запроса.

Код Javascript:

formData = new FormData();

formData.append("file", document.forms[formName].file.files[0]);
formData.append('properties', new Blob([JSON.stringify({
                "name": "root",
                "password": "root"                    
            })], {
                type: "application/json"
            }));

Детали запроса:

method: "POST",
headers: {
         "Content-Type": undefined
  },
data: formData

Запрос полезной нагрузки:

Accept:application/json, text/plain, */*
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryEBoJzS3HQ4PgE1QB

------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: application/txt


------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="properties"; filename="blob"
Content-Type: application/json


------WebKitFormBoundaryvijcWI2ZrZQ8xEBN--

Ответ 2

Как говорится в документации:

Поднят, когда часть запроса "multipart/form-data", идентифицированная его имя не может быть найдено.

Возможно, это связано с тем, что запрос не является многочастным/ потому что часть отсутствует в запросе или потому, что веб-сайт приложение не настроено правильно для обработки multipart запросы - например. no MultipartResolver.

Ответ 3

Это должно сработать!

клиент (angular):

$scope.saveForm = function () {
      var formData = new FormData();
      var file = $scope.myFile;
      var json = $scope.myJson;
      formData.append("file", file);
      formData.append("ad",JSON.stringify(json));//important: convert to JSON!
      var req = {
        url: '/upload',
        method: 'POST',
        headers: {'Content-Type': undefined},
        data: formData,
        transformRequest: function (data, headersGetterFunction) {
          return data;
        }
      };

Backend- Spring Загрузка:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
    public @ResponseBody
    Advertisement storeAd(@RequestPart("ad") String adString, @RequestPart("file") MultipartFile file) throws IOException {

        Advertisement jsonAd = new ObjectMapper().readValue(adString, Advertisement.class);
//do whatever you want with your file and jsonAd