使用Spring RestTemplate上传MultipartFile

2023/05/19

1. 概述

本快速教程重点介绍如何使用Spring的RestTemplate上传MultipartFile。

我们将同时看到单个文件和多个文件,使用RestTemplate上传。

2. 什么是HTTP Multipart请求?

简而言之,基本的HTTP POST请求主体以名称/值对的形式保存表单数据。

另一方面,HTTP客户端可以构造HTTP Multipart请求以向服务器发送文本或二进制文件;它主要用于上传文件。

另一个常见的用例是发送带有附件的电子邮件。Multipart文件请求将大文件分成较小的块,并使用边界标记来指示块的开始和结束。

此处探索有关Multipart请求的更多信息。

3. Maven依赖

这个单一的依赖关系对于客户端应用程序来说已经足够了:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

4. 文件上传服务器

文件服务器API公开了两个REST端点,分别用于上传单个文件和多个文件:

  • POST /fileserver/singlefileupload/
  • POST /fileserver/multiplefileupload/

5. 上传单个文件

首先,让我们看看使用RestTemplate上传单个文件。

我们需要创建带有header和body的HttpEntity。将内容类型标头值设置为MediaType.MULTIPART_FORM_DATA。设置此标头后,RestTemplate会自动编组文件数据以及一些元数据。

元数据包括文件名、文件大小和文件内容类型(例如text/plain):

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

接下来,将请求主体构建为LinkedMultiValueMap类的实例。LinkedMultiValueMap包装了LinkedHashMap,为LinkedList中的每个键存储多个值。

在我们的示例中,getTestFile()方法动态生成一个虚拟文件并返回一个FileSystemResource

MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", getTestFile());

最后,构造一个HttpEntity实例来包装标头和正文对象,并使用RestTemplate发布它。

请注意,单个文件上传指向/fileserver/singlefileupload/端点。

最后,调用restTemplate.postForEntity()完成连接到给定URL并将文件发送到服务器的工作:

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

String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate
    .postForEntity(serverUrl, requestEntity, String.class);

6. 上传多个文件

在多文件上传中,与单文件上传相比的唯一变化是构建请求的主体。

让我们创建多个文件并在MultiValueMap中使用相同的键添加它们。

显然,请求URL应该指的是多文件上传的端点:

MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("files", getTestFile());
body.add("files", getTestFile());
body.add("files", getTestFile());
    
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);

String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate
    .postForEntity(serverUrl, requestEntity, String.class);

始终可以使用多文件上传来模拟单个文件上传。

7. 总结

总之,我们看到了一个使用SpringRestTemplate传输MultipartFile的案例。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章