Загрузка 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.