Mengupload MultipartFile dengan Spring RestTemplate

1. Ikhtisar

Tutorial singkat ini berfokus pada cara mengunggah file multipart menggunakan Spring's RestTemplate.

Kita akan melihat satu file dan banyak file - unggah menggunakan RestTemplate.

2. Apa itu Permintaan Multipart HTTP?

Sederhananya, badan permintaan HTTP POST dasar menyimpan data formulir dalam pasangan nama / nilai.

Di sisi lain, klien HTTP dapat membuat permintaan multi bagian HTTP untuk mengirim file teks atau biner ke server; ini terutama digunakan untuk mengunggah file.

Kasus penggunaan umum lainnya adalah mengirim email dengan lampiran. Permintaan file multibagian memecah file besar menjadi potongan yang lebih kecil dan menggunakan penanda batas untuk menunjukkan awal dan akhir blok.

Jelajahi lebih lanjut tentang permintaan multi bagian di sini.

3. Ketergantungan Maven

Ketergantungan tunggal ini cukup untuk aplikasi klien:

 org.springframework spring-web 5.2.2.RELEASE 

4. Server Unggah File

API server file memperlihatkan dua titik akhir REST untuk masing-masing mengunggah satu dan beberapa file:

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

5. Mengupload File Tunggal

Pertama, mari kita lihat unggahan file tunggal menggunakan RestTemplate.

Kita perlu membuat HttpEntity dengan header dan body. Setel nilai header jenis konten ke MediaType.MULTIPART_FORM_DATA . Saat header ini disetel, RestTemplate secara otomatis menyusun data file bersama dengan beberapa metadata.

Metadata mencakup nama file, ukuran file, dan jenis konten file (misalnya teks / biasa ):

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

Selanjutnya, buat badan permintaan sebagai instance dari kelas LinkedMultiValueMap . LinkedMultiValueMap membungkus LinkedHashMap yang menyimpan beberapa nilai untuk setiap kunci dalam LinkedList .

Dalam contoh kami, metode getTestFile () menghasilkan file dummy dengan cepat dan mengembalikan FileSystemResource :

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

Terakhir, buat instance HttpEntity yang membungkus header dan objek body dan mempostingnya menggunakan RestTemplate .

Perhatikan bahwa unggahan file tunggal mengarah ke / fileserver / singlefileupload / endpoint.

Pada akhirnya, panggilan restTemplate.postForEntity () menyelesaikan pekerjaan menghubungkan ke URL yang diberikan dan mengirim file ke server:

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. Mengupload Banyak File

Dalam beberapa unggahan file, satu-satunya perubahan dari unggahan file tunggal adalah dalam menyusun isi permintaan.

Mari buat banyak file dan tambahkan dengan kunci yang sama di MultiValueMap .

Jelas, URL permintaan harus mengacu pada titik akhir untuk beberapa unggahan file:

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 memungkinkan untuk memodelkan unggahan file tunggal menggunakan unggahan banyak file.

7. Kesimpulan

Sebagai kesimpulan, kami melihat kasus transfer MultipartFile menggunakan Spring RestTemplate .

Seperti biasa, contoh kode sumber klien dan server tersedia di GitHub.