Как отправить multipartFile с помощью Spring RestTemplate? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь отправить файл из одного приложения SpringBoot в другое приложение SpringBoot. Цель, которую я пытаюсь достичь, выглядит как

@PostMapping(
        value = "/upload",
        consumes = MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<ArmResponse<JobData>> uploadInvoices(@RequestParam("file") MultipartFile interestingStuff) {

    String incomingFilename = interestingStuff.getName();
    String originalFilename = interestingStuff.getOriginalFilename();
    String contentType = interestingStuff.getContentType();

    // do interesting stuff here

    return ok(successfulResponse(new JobData()));
}

Код в приложении, выполняющем запрос POST к конечной точке thios, выглядит как

public void loadInvoices(MultipartFile invoices) throws IOException {

    File invoicesFile = new File(invoices.getOriginalFilename());
    invoices.transferTo(invoicesFile);

    LinkedMultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
    parts.add("file", invoicesFile);


    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

    HttpEntity<LinkedMultiValueMap<String, Object>> httpEntity = new HttpEntity<>(parts, httpHeaders);

    String url = String.format("%s/rest/inbound/invoices/upload", baseUrl);

    final List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    messageConverters.add(new ByteArrayHttpMessageConverter());
    messageConverters.add(new ResourceHttpMessageConverter());
    messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    messageConverters.add(new FormHttpMessageConverter());
    messageConverters.add(new SourceHttpMessageConverter<Source>());

    RestTemplate template = new RestTemplate(messageConverters);

    template.exchange(
            url,
            HttpMethod.POST,
            httpEntity,
            new ParameterizedTypeReference<ArmResponse<JobData>>() {

            });
}

Если я отправлю файл в форме, используя почтальон - это работает Заголовок типа контента по запросу от Почтальона выглядит как

content-type:"multipart/form-data; boundary=--------------------------286899320410555838190774"

Когда POST выполняется RestTemplate, я получаю следующую ошибку.

com.fasterxml.jackson.databind.exc.MismatchedInputException: нет содержимого для отображения из-за конца ввода в [Source: (String) ""; строка: 1, столбец: 0]

Я подозреваю, что заголовок типа содержимого, отправляемый в запросе, неверен. Кто-нибудь знает, как правильно установить заголовок типа содержимого для MULTIPART_FORM_DATA?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Решение оказалось очень простым, как обычно.Просто вызовите getResource () для multipartFile.

public void loadInvoices(MultipartFile invoices) throws IOException {

    Resource invoicesResource = invoices.getResource();

    LinkedMultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
    parts.add("file", invoicesResource);

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

    HttpEntity<LinkedMultiValueMap<String, Object>> httpEntity = new HttpEntity<>(parts, httpHeaders);

    restTemplate.postForEntity("my/url", httpEntity, SommeClass.class);
}
0 голосов
/ 13 марта 2019

Зачем вам нужны конвертеры сообщений? Просто используйте код как в этом уроке: https://www.baeldung.com/spring-rest-template-multipart-upload

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate
  .postForEntity(url , httpEntity, String.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...