Как отправить @Requestbody и @Requestpart вместе весной - PullRequest
0 голосов
/ 26 октября 2018

Я хочу передать json и файл вместе в контроллере, используя curl. У меня есть следующий метод в контроллере.

@PostMapping(value = /api/campaign, headers = {"content-type=multipart/mixed","content-type=multipart/form-data"})
    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    public @Valid ResponseDTO campaignCreator (@Valid @RequestBody CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic){
}

Ниже приведена команда curl

curl -i -X POST -H "Content-Type: multipart/mixed" -d "campaignCreatorDTO={\"edipi\":123456789,\"firstName\":\"John\",\"lastName\":\"Smith\",\"email\":\"john.smith@gmail.com\"};type=application/json" -F "file=@newfile.png;type=image/png"  http://localhost:8080/api/campaign

метод контроллера не вызывается. когда я помещаю json в файл и использую file в команде curl вместо прямого json, это работает. Но я не хочу использовать файл для JSON.

Я пытался использовать @RequestPart для объекта json, но та же проблема.

есть ли способ передать файл из нескольких частей в json Я имею в виду объект CampaignCreatorDTO?

Обновление :: Теперь я могу передать RequestPart для обоих типов, но размер изображения составляет 0 байт. Хотя iamge присутствует в файловой системе.

Обновлен код :: теперь используя приведенный ниже код и получая размер файла в 0 байт.

@PostMapping(value = /api/campaign, consumes = {"multipart/form-data","multipart/mixed"})
    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    public @Valid ResponseDTO campaignCreator (@Valid @RequestPart("json") CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic) {
}

Я попробовал решение, приведенное в этой ссылке, но все еще та же проблема

Spring MVC Multipart Request с JSON

так клиент размещает данные на сервере

let formData = new FormData()

const blob = new Blob([json], {
type: 'application/json'
});

formData.append("json", blob)
formData.append("file", values.adCreativeImageCover)

let authToken = sessionStorage.getItem("authToken")

fetch(/api/campaign, {
method: "POST",
headers: {
'Accept': 'application/json',
'X-Auth-Token': authToken,
},
mode: 'cors',
body: formData
})

1 Ответ

0 голосов
/ 31 октября 2018

Я решил проблему, внедрив в конфигурацию multipartresolver.

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