Качване на MultipartFile с Spring RestTemplate

1. Общ преглед

Този бърз урок се фокусира върху това как да качите многочастен файл с помощта на Spring's RestTemplate.

Ще видим както един файл, така и множество файлове - качване с помощта на RestTemplate.

2. Какво е HTTP заявка за няколко части?

Най-просто казано, основното HTTP POST тяло на заявката съдържа данни от формуляр в двойки име / стойност.

От друга страна, HTTP клиентите могат да конструират HTTP заявки за няколко части за изпращане на текстови или двоични файлове на сървъра; използва се главно за качване на файлове.

Друг често срещан случай е изпращането на имейла с прикачен файл. Заявките за многокомпонентни файлове разбиват голям файл на по-малки парчета и използват гранични маркери, за да посочат началото и края на блока.

Разгледайте повече за заявките от няколко части тук.

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

Тази единична зависимост е достатъчна за клиентското приложение:

 org.springframework spring-web 5.2.2.RELEASE 

4. Сървърът за качване на файлове

API на файловия сървър излага две REST крайни точки съответно за качване на единични и множество файлове:

  • POST / файлов сървър / singlefileupload /
  • POST / файлов сървър / multiplefileupload /

5. Качване на един файл

Първо, нека видим качване на един файл с помощта на RestTemplate.

Трябва да създадем HttpEntity с хедър и тяло. Задайте стойността на заглавката на типа съдържание на MediaType.MULTIPART_FORM_DATA . Когато тази заглавка е зададена, RestTemplate автоматично маршализира файловите данни заедно с някои метаданни.

Метаданните включват име на файл, размер на файла и тип съдържание на файла (например текст / обикновен ):

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 = "//localhost:8082/spring-rest/fileserver/singlefileupload/"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity response = restTemplate .postForEntity(serverUrl, requestEntity, String.class);
    

6. Качване на множество файлове

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

Нека създадем множество файлове и да ги добавим със същия ключ в 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 = "//localhost:8082/spring-rest/fileserver/multiplefileupload/"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity response = restTemplate .postForEntity(serverUrl, requestEntity, String.class);
    

Винаги е възможно да се моделира качване на един файл, като се използва качване на множество файлове.

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

В заключение, видяхме при MultipartFile трансфер използвайки Пролет RestTemplate .

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