Загрузка MultipartFile с помощью Spring RestTemplate

Загрузка MultipartFile с помощью Spring RestTemplate

1. обзор

Этот краткий учебник посвящен тому, как загрузить многокомпонентный файл с помощью Spring RestTemplate.

Мы увидим какa single file and multiple files – uploadusing the RestTemplate.

2. Что такое многокомпонентный запрос HTTP?

Проще говоря, базовое тело HTTP-запроса POST содержит данные формы в парах имя / значение.

С другой стороны, HTTP-клиенты могут создавать составные HTTP-запросы для отправки текстовых или двоичных файлов на сервер; в основном он используется для загрузки файлов.

Другим распространенным вариантом использования является отправка электронного письма с вложением. Многокомпонентные запросы файлов разбивают большой файл на более мелкие куски и используют граничные маркеры, чтобы указать начало и конец блока.

Узнайте больше о составных запросахhere.

3. Maven Dependency

Этой единственной зависимости достаточно для клиентского приложения:


    org.springframework
    spring-web
    5.0.7.RELEASE

4. File Upload Server

API файлового сервера предоставляет две конечные точки REST для загрузки одного и нескольких файлов соответственно:

  • POST / файловый сервер / singlefileupload /

  • POST / файловый сервер / multifileupload /

5. Загрузка одного файла

Во-первых, давайте посмотримsingle file upload using the RestTemplate.

Нам нужно создатьHttpEntityw с заголовком и телом. Установите для заголовкаcontent-type значениеMediaType.MULTIPART_FORM_DATA. Когда этот заголовок установлен,RestTemplate автоматически маршалирует данные файла вместе с некоторыми метаданными.

Метаданные включают имя файла, размер файла и тип содержимого файла (например,text/plain):

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

Затем создайте тело запроса как экземпляр классаLinkedMultiValueMap. LinkedMultiValueMap оборачиваетLinkedHashMap, сохраняя несколько значений для каждого ключа вLinkedList.

В нашем примере методgetTestFile( ) генерирует фиктивный файл на лету и возвращаетFileSystemResource:

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

Наконец, создайте экземплярHttpEntity, который обертывает заголовок и объект тела, и опубликуйте его, используяRestTemplate.

Обратите внимание, что загрузка одного файла указывает на конечную точку/fileserver/singlefileupload/.

В конце концов, вызовrestTemplate.postForEntity( ) завершает работу по подключению к данному URL-адресу и отправке файла на сервер:

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

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

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

6. Загрузка нескольких файлов

При загрузке нескольких файлов единственное изменение по сравнению с загрузкой одного файла заключается в создании тела запроса.

Давайте создадим несколько файлов иadd them with the same key вMultiValueMap.

Очевидно, что URL запроса должен ссылаться на конечную точку для загрузки нескольких файлов:

MultiValueMap body
  = new LinkedMultiValueMap<>();
body.add("files", getTestFile());
body.add("files", getTestFile());
body.add("files", getTestFile());

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

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

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

Всегда возможноmodel single file upload using the multiple file upload.

7. Заключение

В заключение мы рассмотрели случай передачиMultipartFile с использованием SpringRestTemplate.

Как всегда, доступен пример исходного кода клиента и сервераover on GitHub.