Использование Spring WebClient для загрузки файла в java - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь перейти с обычных методов HttpPost на Spring WebClient, и у меня есть API, который принимает два файла (один JSON и один PDF) для загрузки.

Я пытаюсь отправить файлы как ниже, но получая 500 Внутренняя ошибка сервера вместо 200 OK.

String jsonData ="";
ByteArrayOutputStream file;

MultipartBodyBuilder builder = new MultipartBodyBuilder();
String header1 = String.format("form-data; name=%s; filename=%s", "attach", "file.pdf");
String header2 = String.format("form-data; name=%s; filename=%s", "jsonfile", "jsonfile.json");

// This line is causing the problem, Am I making a mistake here?
builder.part("attach", file.toByteArray()).header("Content-Disposition", header1);
// This line works fine.
builder.part("jsonfile", jsonData.getBytes()).header("Content-Disposition", header2);

WebClient webClient = WebClient.create("a url");

        byte[] fileContent = null;
        try {
            fileContent = webClient.post()
                .body(BodyInserters.fromMultipartData(builder.build()))
                .retrieve()
                .onStatus(HttpStatus::isError, res -> handleError(res))
                .bodyToMono(byte[].class)
                .block();
        } catch (Exception e) {
            return null;
        }

Однако, если я не отправляю файл PDF в запросе, он работает нормально только с файлом JSON. С Почтальоном оба дела работают нормально.

Я предполагаю, что я делаю ошибку при добавлении файла PDF в запрос. Хотя сам файл является допустимым PDF, а ответ API - это файл JSON.

Если кто-то может сказать мне, что здесь может быть не так.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

После различных изменений мне удалось исправить эту проблему. Это может пригодиться тем, кто сталкивается с этой проблемой.

Вместо непосредственного использования file.toByteArray () используйте новый ByteArrayResource (file.toByteArray ()) вместо этого.

Таким образом, строка выглядит так:

builder.part("attach", new ByteArrayResource(file.toByteArray())).header("Content-Disposition", header1);
0 голосов
/ 15 апреля 2020

Возможно, если вы поместите "file.pdf" в строке 5 в кавычки, решите вашу проблему

...