Охттп создать MultipartBody с пружинным MultipartFile и json объектом - PullRequest
0 голосов
/ 09 марта 2020

У меня есть такой контроллер, который принимает объект MultipartFile и json:

@PostMapping(value = "/v1/submit")
    public ResponseEntity submit(
              @RequestParam(value="myFile", required = true) MultipartFile myFile
            , @Valid @RequestPart(value="fileMeta", required=true) FileMeta fileMeta
    ){

Мне нужно перенаправить его на новый URL-адрес, используя сообщение okhttpclient с Multipartbody, содержащим объекты myFile и fileMeta :

OkHttpClient client = new OkHttpClient();
MultipartBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("myFile", myFile.getName(), okhttp3.RequestBody.create(file, MediaType.parse("pdf"))
                .addFormDataPart("fileMeta", fileMeta)
                .build();

Я получаю следующую ошибку: Не удается разрешить метод 'create (org.springframework.web.multipart.MultipartFile, okhttp3.MediaType)'

1 Ответ

1 голос
/ 09 марта 2020

Определение метода RequestBody create в OkHttp: create(MediaType contentType, byte[] content). Он ожидает сначала MediaType и вторую полезную нагрузку (либо byte[], File, либо другие форматы ).

Итак, сначала вы должны изменить порядок метода аргументы и второе преобразовывают MultipartFile из Spring в правильный формат, который принимает метод create(), например byte[] или File:

OkHttpClient client = new OkHttpClient();
MultipartBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("myFile", myFile.getName(), RequestBody.create(MediaType.parse("pdf"), file)
                .addFormDataPart("fileMeta", fileMeta)
                .build();

В StackOverflow уже доступно несколько решений для преобразования MultipartFile в File: Как преобразовать составной файл в файл?

ОБНОВЛЕНИЕ : Пример использования RestTemplate

@RestController
public class FileSendingController {

  @PostMapping("/files")
  public void streamFile(@RequestParam("file") MultipartFile file) {

    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    body.add("file", file);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);

    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForEntity("http://upload.to", requestEntity, String.class);
  }
}
...