Spring MVC: Comment faire pour retourner l'image dans @ResponseBody?
Je suis de données d'image (comme byte[]
) à partir de DB. Comment retourner cette image dans @ResponseBody
?
MODIFIER
Je l'ai fait sans @ResponseBody
à l'aide de HttpServletResponse
tant que paramètre de méthode:
@RequestMapping("/photo1")
public void photo(HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg");
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
IOUtils.copy(in, response.getOutputStream());
}
À l'aide de @ResponseBody
avec enregistrés org.springframework.http.converter.ByteArrayHttpMessageConverter
convertisseur comme @Sid a dit ne fonctionne pas pour moi :(.
@ResponseBody
@RequestMapping("/photo2")
public byte[] testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
return IOUtils.toByteArray(in);
}
Vous devez vous connecter pour publier un commentaire.
si vous êtes à l'aide de Printemps version 3.1 ou plus récent, vous pouvez spécifier "produit" dans
@RequestMapping
annotation. Exemple ci-dessous fonctionne pour moi hors de la boîte. Pas besoin de s'enregistrer converter ou autre chose si vous avez web mvc activé (@EnableWebMvc
).Avec le Printemps 4.1 et au-dessus, vous pouvez revenir à peu près tout (tels que des images, des pdf, des documents, des pots, des fermetures éclair, etc), tout simplement, sans supplément de dépendances. Par exemple, la suite pourrait être une méthode de retour d'un utilisateur de l'image de profil de MongoDB GridFS:
Les choses sont à noter:
ResponseEntity avec InputStreamResource un type de retour
ResponseEntity générateur de création de style
Avec cette méthode, vous n'avez pas à vous soucier permettra à l'autowiring dans le HttpServletResponse, jetant un IOException ou de copier les données de flux autour de.
Outre l'enregistrement d'un
ByteArrayHttpMessageConverter
, vous souhaiterez peut-être utiliser unResponseEntity
au lieu de@ResponseBody
. Le code suivant fonctionne pour moi :En utilisant Spring 3.1.x et 3.2.x, c'est comment vous devez le faire:
La méthode de contrôleur:
Et le mvc annotation dans servlet-context.xml fichier:
En plus d'un couple de réponses ici quelques pointeurs (Printemps 4.1).
Cas où vous n'avez pas de messageconverters configuré dans votre WebMvcConfig, ayant
ResponseEntity
à l'intérieur de votre@ResponseBody
fonctionne bien.Si vous le faites, c'est à dire que vous avez un
MappingJackson2HttpMessageConverter
configuré (comme moi) à l'aide de laResponseEntity
renvoie uneorg.springframework.http.converter.HttpMessageNotWritableException
.La seule solution dans ce cas consiste à envelopper un
byte[]
dans le@ResponseBody
comme suit:Dans ce cas, ne rememeber pour configurer le messageconverters correctement (et ajouter un
ByteArrayHttpMessageConverer
) dans votre WebMvcConfig, comme suit:Dans votre contexte de l'application de déclarer une AnnotationMethodHandlerAdapter et registerByteArrayHttpMessageConverter:
aussi dans la méthode de gestionnaire d'ensemble de type de contenu approprié pour votre réponse.
A Fonctionné Pour Moi.
Je visez plutôt celui-ci:
Changer le type de média à ce que jamais le format d'image que vous avez.
ResourceLoader
, mais la construction d'un chemin d'accès à partir de l'entrée externe comme dans votre exemple est une mauvaise idée: cwe.mitre.org/data/definitions/22.htmlC'est un travail pour moi dans le Ressort 4.
Non des réponses a travaillé pour moi, j'ai donc réussi à le faire comme ça:
Réglage
Content-Disposition
en-tête, j'ai pu télécharger le fichier avec le@ResponseBody
annotation sur ma méthode.C'est comment je le fais avec Spring Boot et la Goyave:
Au printemps 4, il est très facile, vous n'avez pas besoin de faire des changements dans les haricots. Seulement la marque de votre type de retour de @ResponseBody.
Exemple:-
Je pense que vous avez peut-être besoin d'un service de stockage de fichier de télécharger et d'obtenir ce fichier.
Vérifier plus en détail à partir de ici
1) Créer un espace de Stockage de Sevice
2) Créer un Contrôleur Rest pour télécharger et extraire le fichier
}
Vous devez spécifier le type de support dans la réponse. Je suis à l'aide d'un @GetMapping annotation avec produit = MediaType.IMAGE_JPEG_VALUE. @RequestMapping travail sera le même.
Sans un type de média, il est difficile de deviner ce qui est en fait retourné (inclut la personne qui lit le code, le navigateur, et bien sûr le Printemps lui-même). Un byte[] n'est tout simplement pas spécifique. La seule façon de déterminer le type de média à partir d'un byte[] est reniflant et devinettes autour de.
Fournir un type de média est juste meilleures pratiques