Je reçois des données d'image (comme byte[]
) de DB. Comment renvoyer cette image @ResponseBody
?
ÉDITER
Je l'ai fait sans @ResponseBody
utiliser HttpServletResponse
comme 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());
}
Utiliser @ResponseBody
avec un org.springframework.http.converter.ByteArrayHttpMessageConverter
convertisseur enregistré comme @Sid l'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);
}
la source
En plus d'enregistrer un
ByteArrayHttpMessageConverter
, vous pouvez utiliser un à laResponseEntity
place de@ResponseBody
. Le code suivant fonctionne pour moi:la source
En utilisant Spring 3.1.x et 3.2.x, voici comment procéder:
La méthode du contrôleur:
Et l'annotation mvc dans le fichier servlet-context.xml:
la source
En plus de quelques réponses, voici quelques conseils (Spring 4.1).
Dans le cas où vous n'avez aucun convertisseur de messagerie configuré dans votre WebMvcConfig, ayant à l'
ResponseEntity
intérieur de votre@ResponseBody
travaux bien.Si vous le faites, c'est à dire que vous avez
MappingJackson2HttpMessageConverter
configuré (comme moi) en utilisant lesResponseEntity
retours aorg.springframework.http.converter.HttpMessageNotWritableException
.La seule solution de travail dans ce cas est d'envelopper un
byte[]
dans le@ResponseBody
comme suit:Dans ce cas, n'oubliez pas de configurer correctement les convertisseurs de messages (et ajoutez un
ByteArrayHttpMessageConverer
) dans votre WebMvcConfig, comme ceci:la source
Dans le contexte de votre application, déclarez un AnnotationMethodHandlerAdapter et registerByteArrayHttpMessageConverter:
également dans la méthode du gestionnaire, définissez le type de contenu approprié pour votre réponse.
la source
A travaillé pour moi.
la source
Je préfère celui-ci:
Changez le type de support pour le format d'image que vous avez.
la source
ResourceLoader
, mais construire un chemin à partir d'une entrée externe comme dans votre exemple est une mauvaise idée: cwe.mitre.org/data/definitions/22.htmlCela fonctionne pour moi au printemps 4.
la source
Aucune des réponses n'a fonctionné pour moi, alors j'ai réussi à le faire comme ça:
Définition de l'en-
Content-Disposition
tête J'ai pu télécharger le fichier avec l'@ResponseBody
annotation sur ma méthode.la source
Vous devez spécifier le type de média dans la réponse. J'utilise une annotation @GetMapping avec produit = MediaType.IMAGE_JPEG_VALUE. @RequestMapping fonctionnera de la même manière.
Sans un type de média, il est difficile de deviner ce qui est réellement retourné (y compris quiconque lit le code, le navigateur et bien sûr Spring lui-même). Un octet [] n'est tout simplement pas spécifique. La seule façon de déterminer le type de média à partir d'un octet [] est de renifler et de deviner.
Fournir un type de média n'est que la meilleure pratique
la source
Voici comment je le fais avec Spring Boot et Guava:
la source
Au printemps 4, il est très facile de ne pas modifier les haricots. Marquez uniquement votre type de retour sur @ResponseBody.
Exemple:-
la source
Je pense que vous avez peut-être besoin d'un service pour stocker le téléchargement de fichiers et obtenir ce fichier. Vérifiez plus de détails sur ici
1) Créer un service de stockage
2) Créez un contrôleur de repos pour télécharger et obtenir un fichier
}
la source