如何使用 spring RestTemplate 发送 multipartFile?

Ror*_*nch 4 spring multipartform-data resttemplate spring-boot

我正在尝试将文件从一个 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()));
}
Run Code Online (Sandbox Code Playgroud)

应用程序中向 thios 端点执行 POST 请求的代码如下所示

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>>() {

            });
}
Run Code Online (Sandbox Code Playgroud)

如果我使用邮递员在表单中发布文件 - 它可以工作邮递员请求的内容类型标头看起来像

content-type:"multipart/form-data; boundary=--------------------------286899320410555838190774"
Run Code Online (Sandbox Code Playgroud)

当 RestTemplate 执行 POST 时,我收到以下错误。

com.fasterxml.jackson.databind.exc.MismatchedInputException:由于[来源:(字符串)“”的输入结束,没有要映射的内容;行:1,列:0]

我怀疑请求中发送的内容类型标头是错误的。有谁知道如何正确设置 MULTIPART_FORM_DATA 的内容类型标头?

Ror*_*nch 10

和往常一样,解决方案非常简单。只需在 multipartFile 上调用 getResource()。

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我的问题已经通过 `invices.getResource( )` 解决了,谢谢 :D (2认同)