Spring 网络客户端 multipart/form-data 请求

Spring Webclient multipart/form-data request

我是 Java(Spring 启动)的新手,我正在尝试向 s3 发送 multipart/form-data POST 请求以上传文件。

我设法使用 spring 的 RestTemplate 做到了这一点:

    public String uploadFile(byte[] file, Map<String, Object> fields, String url) throws URISyntaxException {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        MultiValueMap<String, Object> formData= new LinkedMultiValueMap<String, Object>();
        for (Map.Entry<String, Object> entry : fields.entrySet()) {
            formData.add(entry.getKey(), entry.getValue());
        }
        formData.add("file", file);
        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(formData, headers);
        String response = restTemplate.postForObject(new URI(url), request, String.class);
        return response;
    }

然后我尝试使用 webclient 做同样的事情,但我做不到,AWS 回应 The body of your POST request is not well-formed multipart/form-data.

这是使用 webclient 的代码:

    public String uploadFileWebc(byte[] file, Map<String, Object> fields, String url) {

        MultipartBodyBuilder builder = new MultipartBodyBuilder();
        for (Map.Entry<String, Object> entry : fields.entrySet()) {
            builder.part(entry.getKey(), entry.getValue(), MediaType.TEXT_PLAIN);
        }

        builder.part("file", file).filename("file");
        MultiValueMap<String, HttpEntity<?>> parts = builder.build();


        Void result = webClient.filter(errorHandlingFilter()).build().post().uri(url)
                .contentType(MediaType.MULTIPART_FORM_DATA)
                .contentLength(file.length)
                .bodyValue(parts)
                .retrieve()
                .bodyToMono(Void.class)
                .block();
        return "Done Uploading.";
    }

任何人都可以指出我错过了什么吗?

事实证明,webclient由于其流媒体特性而没有添加content-length header,而S3 API需要这个header已发送。

我最终使用 restTemplate 将文件上传到 S3。