Multipartfile в java dto - PullRequest
       7

Multipartfile в java dto

0 голосов
/ 14 марта 2020

Мое требование: я хотел бы получить данные json вместе с файлом.
Пользователь может загрузить файл и отправить свои данные как (например, имя, адрес электронной почты, изображение);

У меня простой DTO выглядит так (ниже)

public class SampleDTO {

    private String sample1;
    private MultipartFile file;

    public String getSample1() {
        return sample1;
    }
    public MultipartFile getFile() {
        return file;
    }
    public void setSample1(String sample1) {
        this.sample1 = sample1;
    }
    public void setFile(MultipartFile file) {
        this.file = file;
    }
}

У меня пример API выглядит следующим образом (ниже)

@PostMapping("/sampleAPI")
public void sampleAPI(@RequestBody SampleDTO sampleDto) {
 log.info("sampleDto"+sampleDto);
 log.info("sampleDtoFile"+sampleDto.getFile());
 log.info("sampleDtoSample1"+sampleDto.getSample1());
}

Если я вызываю этот API, журналы не печатаются, и я получаю этот тип ошибки (Internal server error). Что я здесь не так делаю?

Я использовал formdata Постмена как тело, а в javascript new FormData() как тело API.

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Вы не можете отправить файл mutli-part внутри объекта при передаче по запросу в API. Попробуйте передать все параметры как ПАРАМЕТРЫ ЗАПРОСА как часть запроса отдельно.

Также не забудьте внести изменения в свои API соответственно, как указано выше.

При использовании Postman убедитесь, что вы в теле в форме данных с ключами и значениями Также пометьте ключи соответствующими типами (текст / файл). СКРИНШОТ НИЖЕ

enter image description here

0 голосов
/ 14 марта 2020

Вместо использования @Requestbody используйте @RequestParam для получения формы MultiPart Mix.

@PostMapping("/sampleAPI")
public String upload(@RequestParam("file") MultipartFile file, 
                       @RequestParam("sample1") String sample1 ) {
    SampleDTO sampleDto = new SampleDTO ();
    sampleDto.setSample1(sample1);
    sampleDto.setFile(file);
    return sample1 + "\n" + file.getOriginalFilename() + "\n" + file.getSize();
}

Для нескольких ключей попробуйте использовать @RequestParam вместе с Converter, что-то вроде этого.

@Component
public class StringToSampleDTOConverter implements Converter<String, SampleDTO> {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    @SneakyThrows
    public SampleDTO convert(String source) {
      return objectMapper.readValue(source, SampleDTO.class);
    }
}

@PostMapping("/sampleAPI")
public String upload(@RequestParam("file") MultipartFile file, 
                   @RequestParam("sampleDto") SampleDTO sampleDto ) {
    sampleDto.setFile(file);
    return sampleDto + "\n" + file.getOriginalFilename() + "\n" + file.getSize();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...