151 votes

Spring MVC : Comment renvoyer une image dans @ResponseBody ?

Je reçois des données d'image (en tant que byte[] ) de la DB. Comment retourner cette image dans @ResponseBody ?

EDIT

Je l'ai fait sans @ResponseBody en utilisant HttpServletResponse comme paramètre de la 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());
}

Utilisation de @ResponseBody avec enregistré org.springframework.http.converter.ByteArrayHttpMessageConverter Le convertisseur 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);
}

100voto

michal.kreuzman Points 3214

Si vous utilisez la version de Spring 3.1 ou une version plus récente, vous pouvez spécifier "produces" dans le champ @RequestMapping annotation. L'exemple ci-dessous fonctionne pour moi sans problème. Il n'est pas nécessaire d'utiliser un convertisseur de registre ou quoi que ce soit d'autre si vous avez activé le web mvc ( @EnableWebMvc ).

@ResponseBody
@RequestMapping(value = "/photo2", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] testphoto() throws IOException {
    InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
    return IOUtils.toByteArray(in);
}

0 votes

Existe-t-il un moyen de spécifier le nom du fichier dans cette approche ?

60voto

Siggen Points 406

En plus de l'enregistrement d'un ByteArrayHttpMessageConverter vous pouvez utiliser un ResponseEntity au lieu de @ResponseBody . Le code suivant fonctionne pour moi :

@RequestMapping("/photo2")
public ResponseEntity<byte[]> testphoto() throws IOException {
    InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");

    final HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.IMAGE_PNG);

    return new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED);
}

16voto

Peymankh Points 634

En utilisant Spring 3.1.x et 3.2.x, voici comment vous devez procéder :

La méthode du contrôleur :

@RequestMapping("/photo2")
public @ResponseBody byte[] testphoto() throws IOException {
    InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
    return IOUtils.toByteArray(in);
}

Et l'annotation mvc dans le fichier servlet-context.xml :

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>image/jpeg</value>
                    <value>image/png</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

6voto

Sid Points 91

Dans le contexte de votre application, déclarez un AnnotationMethodHandlerAdapter et enregistrezByteArrayHttpMessageConverter :

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="messageConverters">
    <util:list>
      <bean id="byteArrayMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
    </util:list>
  </property>
</bean> 

Dans la méthode du gestionnaire, définissez également le type de contenu approprié pour votre réponse.

0 votes

@jsinghfoss se référer à la réponse du haut.

0voto

ankitkatiyar91 Points 229

Au printemps 4, c'est très facile, vous n'avez pas besoin de faire de changements dans les haricots. Marquez seulement votre type de retour à @ResponseBody.

Exemple:-

@RequestMapping(value = "/image/{id}")
    public @ResponseBody
    byte[] showImage(@PathVariable Integer id) {
                 byte[] b;
        /* Do your logic and return 
               */
        return b;
    }

1 votes

Le problème que je rencontre est que le type de contenu n'est pas défini correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X