Učitavanje MultipartFile s Spring RestTemplate

1. Pregled

Ovaj se brzi vodič usredotočuje na to kako prenijeti datoteku s više dijelova pomoću Spring's RestTemplate.

Vidjet ćemo oboje jedna datoteka i više datoteka - uploadpomoću RestTemplate.

2. Što je HTTP zahtjev za više dijelova?

Jednostavno rečeno, osnovno tijelo zahtjeva HTTP POST sadrži podatke obrasca u parovima ime / vrijednost.

S druge strane, HTTP klijenti mogu konstruirati HTTP višedijelne zahtjeve za slanje tekstualnih ili binarnih datoteka na poslužitelj; uglavnom se koristi za prijenos datoteka.

Još jedan uobičajeni slučaj upotrebe je slanje e-pošte s privitkom. Zahtjevi za višedijelne datoteke raščlanjuju veliku datoteku na manje dijelove i pomoću graničnih oznaka označavaju početak i kraj bloka.

Ovdje saznajte više o višedijelnim zahtjevima.

3. Ovisnost Mavena

Ova pojedinačna ovisnost dovoljna je za klijentsku aplikaciju:

 org.springframework spring-web 5.2.2.OSLOBOĐENJE 

4. The Poslužitelj za prijenos datoteka

API poslužitelja datoteka izlaže dvije REST krajnje točke za prijenos pojedinačnih, odnosno više datoteka:

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

5. Učitavanje jedne datoteke

Prvo, da vidimo prijenos jedne datoteke pomoću RestTemplate.

Moramo stvarati HttpEntityzaglavljem i tijelom. Postavi tip sadržaja vrijednost zaglavlja do MediaType.MULTIPART_FORM_DATA. Kada je postavljeno ovo zaglavlje, RestTemplate automatski razvrstava podatke datoteke zajedno s nekim metapodacima.

Metapodaci uključuju naziv datoteke, veličinu datoteke i vrstu sadržaja datoteke (na primjer tekst / običan):

HttpHeaders zaglavlja = novi HttpHeaders (); headers.setContentType (MediaType.MULTIPART_FORM_DATA);

Dalje, izgradite tijelo zahtjeva kao primjerak LinkedMultiValueMap razred. LinkedMultiValueMap oblozi LinkedHashMap spremanje više vrijednosti za svaki ključ u a LinkedList.

U našem primjeru, getTestFile () metoda generira lažnu datoteku u letu i vraća datoteku FileSystemResource:

MultiValueMap body = novo LinkedMultiValueMap (); body.add ("datoteka", getTestFile ());

Konačno, konstruirajte HttpEntity instanca koja omotava zaglavlje i objekt tijela i objavljuje ga pomoću a RestTemplate.

Imajte na umu da prijenos jedne datoteke upućuje na / fileserver / singlefileupload / krajnja točka.

Na kraju, poziv restTemplate.postForEntity () dovršava posao povezivanja na zadani URL i slanja datoteke na poslužitelj:

HttpEntity requestEntity = novi HttpEntity (tijelo, zaglavlja); Niz poslužiteljaUrl = "// localhost: 8082 / spring-rest / fileserver / singlefileupload /"; RestTemplate restTemplate = novi RestTemplate (); ResponseEntity odgovor = restTemplate .postForEntity (serverUrl, requestEntity, String.class);

6. Učitavanje više datoteka

U višestrukom prijenosu datoteka, jedina promjena u prijenosu jedne datoteke je u konstruiranju tijela zahtjeva.

Stvorimo više datoteka i dodajte ih istim ključem u MultiValueMap.

Očito bi se URL zahtjeva trebao odnositi na krajnju točku za prijenos više datoteka:

MultiValueMap body = novo LinkedMultiValueMap (); body.add ("datoteke", getTestFile ()); body.add ("datoteke", getTestFile ()); body.add ("datoteke", getTestFile ()); HttpEntity requestEntity = novi HttpEntity (tijelo, zaglavlja); Niz poslužiteljaUrl = "// localhost: 8082 / spring-rest / fileserver / multiplefileupload /"; RestTemplate restTemplate = novi RestTemplate (); ResponseEntity odgovor = restTemplate .postForEntity (serverUrl, requestEntity, String.class);

To je uvijek moguće modelirati prijenos jedne datoteke pomoću višestrukog prijenosa datoteka.

7. Zaključak

U zaključku smo vidjeli slučaj MultipartFile prijenos pomoću Springa RestTemplate.

Kao i uvijek, primjer izvornog koda klijenta i poslužitelja dostupan je na GitHub-u.