Télécharger une image ou un fichier avec Spring MVC

1. Vue d’ensemble

Le traitement de fichiers statiques sur le client peut être effectué de différentes manières, et l’utilisation d’un contrôleur Spring n’est pas nécessairement la meilleure option disponible.

Cependant, la route des contrôleurs est parfois nécessaire - et c’est ce sur quoi nous allons nous concentrer dans cet article rapide __

2. Utilisation de @ ResponseBody

La première solution simple consiste à utiliser l’annotation @ ResponseBody sur une méthode de contrôleur pour indiquer que l’objet renvoyé par la méthode doit être dirigé directement vers le corps de la réponse HTTP:

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

Ainsi, cette méthode renverra simplement la chaîne Hello world au lieu de retourner une vue portant le nom Hello world , comme une application MVC plus typique.

Avec @ ResponseBody , nous pouvons renvoyer à peu près tous les types de supports, à condition que nous ayons un convertisseur de messages HTTP correspondant capable de les gérer et de les transférer dans le flux de sortie.

3. Utilisation de produces pour renvoyer des images

Le renvoi de tableaux d’octets nous permet de renvoyer presque tout, comme des images ou des fichiers

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

Ici, nous ne définissons pas que le tableau d’octets renvoyé est une image.

Par conséquent, le client ne pourra pas gérer cela comme une image - et il est probable que le navigateur affichera simplement les octets réels de l’image.

Pour définir que le tableau d’octets renvoyé correspond à une image, nous pouvons définir l’attribut produces de l’annotation @ GetMapping pour préciser le type MIME de l’objet renvoyé:

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

Ici, produces est défini sur MediaType.IMAGE JPEG VALUE pour indiquer que l’objet renvoyé doit être traité comme une image JPEG.

Et maintenant, le navigateur va reconnaître et afficher correctement le corps de la réponse sous forme d’image.

4. Utilisation de produces pour renvoyer des données brutes

Le paramètre produces peut être défini avec un grand nombre de valeurs différentes (la liste complète peut être trouvée ici ) en fonction du type d’objet que nous voulons retourner.

Par conséquent, si nous voulons renvoyer un fichier brut, nous pouvons simplement utiliser 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);
}

5. Conclusion

Dans cet article rapide, nous avons examiné un problème simple: renvoyer des images ou des fichiers depuis un contrôleur Spring.

Et, comme toujours, l’exemple de code peut être trouvé à l’adresse over sur Github .