【问题标题】:Using Spring WebClient to upload a file in javajava中使用Spring WebClient上传文件
【发布时间】:2020-07-28 11:04:47
【问题描述】:

我正在尝试从普通的 HttpPost 方法迁移到 Spring WebClient,并且我有一个 API 可以接受两个文件(一个 JSON 和一个 PDF)进行上传。

我正在尝试发送如下文件,但收到 500 Internal Server Error 而不是 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 文件。 使用 Postman 两种情况都可以正常工作。

我认为我在将 PDF 文件添加到请求时出错了。 虽然文件本身是有效的 PDF,但 API 的响应是 JSON 文件。

如果有人能告诉我这里可能出了什么问题。

【问题讨论】:

标签: java spring upload spring-webclient


【解决方案1】:

经过各种更改,我能够解决此问题。对于偶然发现这个问题的人来说,它可能会派上用场。

不要直接使用 file.toByteArray(),而是使用 new ByteArrayResource(file.toByteArray())

所以这条线看起来像:

builder.part("attach", new ByteArrayResource(file.toByteArray())).header("Content-Disposition", header1);

【讨论】:

    【解决方案2】:

    也许如果您将第 5 行中的“file.pdf”放入引号中可以解决您的问题

    【讨论】:

    • 我分享的代码中,为了便于理解,所有使用的变量和常量都替换为字符串。
    猜你喜欢
    • 2021-01-19
    • 2021-09-30
    • 1970-01-01
    • 2021-03-07
    • 2017-09-09
    • 2011-02-22
    • 2019-01-11
    • 2020-08-13
    • 2012-06-18
    相关资源
    最近更新 更多