Memuat naik MultipartFile dengan Spring RestTemplate

1. Gambaran keseluruhan

Tutorial ringkas ini memberi tumpuan kepada cara memuat naik fail multipart menggunakan Spring's RestTemplate.

Kami akan melihat satu fail dan beberapa fail - muat naik menggunakan RestTemplate.

2. Apa itu Permintaan Multipart HTTP?

Ringkasnya, badan permintaan HTTP POST asas menyimpan data borang dalam pasangan nama / nilai.

Sebaliknya, pelanggan HTTP dapat membina permintaan berbilang HTTP untuk menghantar teks atau fail binari ke pelayan; terutamanya digunakan untuk memuat naik fail.

Lain-lain kes penggunaan biasa ialah menghantar e-mel dengan lampiran. Permintaan fail multipart memecah fail besar menjadi bahagian yang lebih kecil dan menggunakan penanda sempadan untuk menunjukkan permulaan dan akhir blok.

Terokai lebih lanjut mengenai permintaan berbilang bahagian di sini.

3. Ketergantungan Maven

Pergantungan tunggal ini cukup untuk aplikasi pelanggan:

 org.springframework spring-web 5.2.2.RELEASE 

4. Pelayan Muat Naik Fail

API pelayan fail mendedahkan dua titik akhir REST untuk memuat naik fail tunggal dan berbilang masing-masing:

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

5. Memuat naik Fail Tunggal

Pertama, mari kita lihat muat naik fail tunggal menggunakan RestTemplate.

Kita perlu membuat HttpEntity dengan tajuk dan badan. Tetapkan nilai tajuk jenis kandungan ke MediaType.MULTIPART_FORM_DATA . Apabila header ini diatur, RestTemplate secara automatik mengumpulkan data fail bersama dengan beberapa metadata.

Metadata merangkumi nama fail, ukuran fail, dan jenis kandungan fail (contohnya teks / dataran ):

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

Seterusnya, bina badan permintaan sebagai contoh kelas LinkedMultiValueMap . LinkedMultiValueMap membungkus LinkedHashMap menyimpan pelbagai nilai untuk setiap kunci dalam LinkedList .

Dalam contoh kami, kaedah getTestFile () menghasilkan fail dummy dengan cepat dan mengembalikan FileSystemResource :

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

Akhirnya, bina contoh HttpEntity yang membungkus tajuk dan objek badan dan siarkannya menggunakan RestTemplate .

Perhatikan bahawa muat naik fail tunggal menunjuk ke / fileserver / singlefileupload / endpoint.

Pada akhirnya, call restTemplate.postForEntity () menyelesaikan tugas menyambung ke URL yang diberikan dan menghantar fail ke pelayan:

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. Memuat naik Berbilang Fail

Dalam beberapa muat naik fail, satu-satunya perubahan dari muat naik fail tunggal adalah dengan membina badan permintaan.

Mari buat beberapa fail dan tambahkannya dengan kunci yang sama di MultiValueMap .

Jelas, URL permintaan harus merujuk kepada titik akhir untuk beberapa muat naik fail:

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);
    

Selalu dimungkinkan untuk memodelkan muat naik fail tunggal menggunakan beberapa fail muat naik.

7. Kesimpulannya

Sebagai kesimpulan, kami melihat kes pemindahan MultipartFile menggunakan Spring RestTemplate .

Seperti biasa, contoh kod sumber pelanggan dan pelayan tersedia di GitHub.