2013-03-29 14 views
5

Sto usando Spring 3.0.1.RELEASE per la mia webapp (e non ho modo di aggiornarlo) e sto provando a visualizzare alcune immagini dal database sulla pagina web.Come restituire correttamente un'immagine nella risposta nell'app di primavera?

Ho seguendo semplici configurazioni Spring:

primavera-application.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:task="http://www.springframework.org/schema/task" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 

    <task:annotation-driven /> 

    <context:annotation-config /> 

    <context:spring-configured /> 

    <context:component-scan base-package="com.me" /> 

    <bean id="hibernateSessionFactory" class="com.me.dbaccess.HibernateSessionFactory"> 
     <constructor-arg ref="sessionFactory"/> 
    </bean> 
</beans> 

molla mvc.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <mvc:annotation-driven/> 

    <bean id="tilesViewResolver" class="com.me.util.TilesExposingBeansViewResolver"> 
     <property name="viewClass" value="com.me.util.TilesExposingBeansView"/> 
     <property name="exposeContextBeansAsAttributes" value="true"/> 
    </bean> 

    <bean id="tilesConfigurer" 
      class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/config/tiles-defs.xml</value> 
      </list> 
     </property> 
    </bean> 
</beans> 

Ho seguente controller:

@Controller 
public class PhotoController { 
    @RequestMapping("/carPhoto.html") 
    @ResponseBody 
    public byte[] getCarPhoto(
      @RequestParam(UrlParameters.PHOTO_ID) Integer photoId, 
      @RequestParam(UrlParameters.PHOTO_TYPE) String photoType) { 
     //return image's bytes array from db by photo Id and Type; 
    } 
} 

E, infine, ho semplice jsp-page:

<%@page contentType="text/html; charset=utf-8"%> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<img id="photoImage" src="<c:url value="/carPhoto.html?photoType=1&photoId=22556793"/>" /> 

Se apro questa pagina - posso vedere questa immagine, senza alcun problema.

Ma se copio l'attributo "src" dell'immagine e lo incollo nella barra degli indirizzi del browser (Firefox 19.0.2) - allora il browser mi offre di salvare carPhoto.html, invece di renderizzare l'immagine. Devo eseguire qualche setup aggiuntivo?

+0

è problema thie risolto, se sì, si prega di condividere come, sto affrontando lo stesso problema – Abhilash

risposta

2

Ci sono diversi modi. Il metodo più semplice è utilizzare @ResponseBody con un byte [] come tipo di ritorno, impostare Content-Type e così via, scrivere i byte nel flusso di output utilizzando HttpServletResponse.

Una soluzione più elegante (IMO) sarebbe quella di restituire un ModelAndView, quindi impostare la visualizzazione su quella in una visualizzazione personalizzata che imposta le intestazioni appropriate (Content-Type e così via) e scrive i byte sul flusso di output di HttpServletResponse .


+0

+1 per l'analisi del tipo MIME manca, ma è "la soluzione più elegante" è una soluzione di primavera 2.x. Spring 3.x ha alcuni modi più eleganti (IMO) (vedi la mia risposta) – Ralph

+0

Grazie per la risposta rapida. – kumade

+0

Ups. Impossibile modificare il mio commento precedente. Grazie per la risposta rapida. Ho cercato di impostare tipo di contenuto, ma senza successo (forse sto facendo male): ' public byte [] getCarPhoto ( @RequestParam Integer PhotoID, @RequestParam String fototipo, HttpServletResponse risposta) { byte [] image = immagine da db; response.setContentType ("image/jpg"); response.setContentLength (image.length); immagine di ritorno; } 'Per quanto riguarda 'soluzione più elegante' - non è troppo complicato per un compito così semplice? :) – kumade

6

Il problema è che è necessario specificare il tipo MIME (e se l'immagine è più grande sarà necessario specificare la sua lunghezza troppo).

Un altra soluzione() è per restituire un Spring ResponseEntity o HttpEntity (HttpEntity è sufficiente se si torna sempre codice di stato HTTP 200, ResponseEntity (una sottoclasse di HttpEntity) è per esempio necessario se si desidera tornare altri codici di stato http, come non trovato).

@Controller 
public class PhotoController { 
    @RequestMapping("/carPhoto.html") 
    @ResponseBody 
    public HttpEntity<byte[]> getCarPhoto(
      @RequestParam(UrlParameters.PHOTO_ID) Integer photoId, 
      @RequestParam(UrlParameters.PHOTO_TYPE) String photoType) { 


     byte[] image = image's bytes array from db by photo Id and Type; 

     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.IMAGE_JPEG); //or what ever type it is 
     headers.setContentLength(image.length); 
     return new HttpEntity<byte[]>(image, headers); 
    } 
} 
+0

Grazie per la risposta. Mi piacerebbe usare la tua soluzione ma non posso farlo con la mia versione Spring (3.0.1.RELEASE). HttpEntity e ResponseEntity provengono da 3.1.x, giusto? – kumade

+0

'HttpEntity' e' ResponseEntity' sono introdotti in 3.0.2 – Ralph

+0

Vedo, ma comunque non posso usarlo, perché non posso aggiornare a 3.0.2. Ci sono cose simili in 3.0.1? – kumade

Problemi correlati