Рубрики
Без рубрики

Загрузка составного файла с помощью Spring RestTemplate

Узнайте, как загружать файлы с помощью RestTemplate Spring.

Автор оригинала: baeldung.

1. Обзор

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

Мы увидим как один файл, так и несколько файлов – загрузите с помощью RestTemplate.

2. Что такое составной HTTP-Запрос?

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

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

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

Подробнее о составных запросах здесь .

3. Зависимость Maven

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


    org.springframework
    spring-web
    5.2.2.RELEASE

4. Сервер Загрузки Файлов

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

  • POST/файловый сервер/загрузка одного файла/
  • POST/файловый сервер/multiplefileupload/

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

Во-первых, давайте посмотрим загрузку одного файла с помощью RestTemplate.

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

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

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

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

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

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

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

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

В конце концов вызов 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. Загрузка Нескольких Файлов

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

Давайте создадим несколько файлов и добавим их с одним и тем же ключом в многозначную карту .

Очевидно, что 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);

Всегда можно моделировать загрузку одного файла, используя загрузку нескольких файлов.

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

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

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