Muat turun Imej atau Fail dengan Spring MVC

1. Gambaran keseluruhan

Melayan fail statik kepada pelanggan dapat dilakukan dengan pelbagai cara, dan menggunakan Spring Controller tidak semestinya pilihan terbaik.

Walau bagaimanapun, kadang-kadang laluan pengawal diperlukan - dan itulah yang akan kita fokuskan dalam artikel ringkas ini.

2. Pergantungan Maven

Pertama, kita perlu menambahkan kebergantungan pada pom.xml kami :

 org.springframework.boot spring-boot-starter-web 

Itu sahaja, kami tidak memerlukan perkara lain di sini. Untuk maklumat versi, pergi ke Maven Central.

3. Menggunakan @ResponseBody

Penyelesaian langsung pertama adalah menggunakan anotasi @ResponseBody pada kaedah pengawal untuk menunjukkan bahawa objek yang dikembalikan oleh kaedah tersebut harus dihantarkan terus ke badan respons HTTP:

@GetMapping("/get-text") public @ResponseBody String getText() { return "Hello world"; } 

Oleh itu, kaedah ini hanya akan mengembalikan tali Hello world daripada mengembalikan paparan yang namanya Hello world , seperti aplikasi MVC yang lebih khas.

Dengan @ResponseBody kita dapat mengembalikan hampir semua jenis media, selagi kita mempunyai penukar Mesej HTTP yang sesuai yang dapat menangani dan menyelesaikannya ke aliran output.

4. Menggunakan menghasilkan untuk Mengembalikan Imej

Mengembalikan susunan bait membolehkan kami mengembalikan hampir semua perkara - seperti gambar atau fail:

@GetMapping(value = "/image") public @ResponseBody byte[] getImage() throws IOException { InputStream in = getClass() .getResourceAsStream("/com/baeldung/produceimage/image.jpg"); return IOUtils.toByteArray(in); } 

Di sini, kami tidak menentukan bahawa array byte yang dikembalikan adalah imej. Oleh itu, pelanggan tidak akan dapat menangani ini sebagai gambar - dan kemungkinan besar penyemak imbas hanya akan memaparkan bait sebenar gambar.

Untuk menentukan bahawa array byte dikembalikan sesuai dengan gambar, kita dapat menetapkan atribut menghasilkan anotasi @GetMapping untuk tepat jenis MIME objek yang dikembalikan:

@GetMapping( value = "/get-image-with-media-type", produces = MediaType.IMAGE_JPEG_VALUE ) public @ResponseBody byte[] getImageWithMediaType() throws IOException { InputStream in = getClass() .getResourceAsStream("/com/baeldung/produceimage/image.jpg"); return IOUtils.toByteArray(in); } 

Di sini menghasilkan diset ke MediaType.IMAGE_JPEG_VALUE untuk menunjukkan bahawa objek yang dikembalikan mesti dikendalikan sebagai gambar JPEG.

Dan sekarang, penyemak imbas akan mengenali dan memaparkan badan respons dengan betul sebagai gambar.

5. Menggunakan menghasilkan untuk Mengembalikan Data Mentah

Parameter yang dihasilkan dapat diatur ke banyak nilai yang berbeza (senarai lengkap boleh didapati di sini) bergantung pada jenis objek yang ingin kita kembalikan.

Oleh itu, jika kita ingin mengembalikan fail mentah, kita boleh menggunakan APPLICATION_OCTET_STREAM_VALUE :

@GetMapping( value = "/get-file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE ) public @ResponseBody byte[] getFile() throws IOException { InputStream in = getClass() .getResourceAsStream("/com/baeldung/produceimage/data.txt"); return IOUtils.toByteArray(in); } 

6. Kesimpulannya

Dalam artikel ringkas ini, kami telah melihat masalah sederhana - mengembalikan gambar atau fail dari Spring Controller.

Dan, seperti biasa, kod contoh boleh didapati di Github.