2013-03-29 13 views
5

Używam Spring 3.0.1.RELEASE dla mojej aplikacji webowej (i nie mam sposobu na jej uaktualnienie) i próbuję renderować niektóre obrazy z bazy danych na stronie internetowej.Jak prawidłowo zwrócić obraz w odpowiedzi w aplikacji Wiosna?

I mają następujące proste konfiguracyjne wiosenny

sprężyny 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> 

sprężyny 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> 

I mają następujące regulatora:

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

I wreszcie, mam prosty JSP strony:

<%@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"/>" /> 

Jeśli otworzyć tę stronę - Mogę zobaczyć ten obraz bez żadnych problemów.

Ale jeśli skopiuję atrybut "src" obrazu i wkleję go w pasku adresu przeglądarki (Firefox 19.0.2) - wtedy przeglądarka oferuje mi zapisywanie carPhoto.html, zamiast renderowania obrazu. Czy powinienem wykonać dodatkowe ustawienia?

+0

jest kwestia Thie rozwiązany, jeśli tak proszę podzielić jak, jestem stoi ten sam problem – Abhilash

Odpowiedz

2

Istnieje kilka sposobów. Najłatwiej jest użyć @ResponseBody z bajtem [] jako typem powrotu, ustawić typ zawartości i takie, zapisać bajty do strumienia wyjściowego za pomocą HttpServletResponse.

Bardziej eleganckim rozwiązaniem (IMO) byłoby zwrócenie ModelAndView, następnie ustawienie widoku na niestandardowy widok, który ustawia odpowiednie nagłówki (Content-Type i inne) i wypisuje bajty do strumienia wyjściowego HttpServletResponse .


+0

+1 do analizy brakującego typu MIME, ale „bardziej eleganckie rozwiązanie” jest rozwiązaniem wiosna 2.x. Spring 3.x ma kilka bardziej eleganckich sposobów (IMO) (zobacz moją odpowiedź) – Ralph

+0

Dziękuję za szybką odpowiedź. – kumade

+0

Ups. Nie mogę edytować mojego poprzedniego komentarza. Dziękujemy za szybką odpowiedź. Próbowałem ustawić typ zawartości, ale bez powodzenia (Być może robię to źle): ' bajt publicznej [] getCarPhoto ( @RequestParam Integer PHOTOID, @RequestParam String fototypu, HttpServletResponse odpowiedzi) { bajt [] image = obraz z db; response.setContentType ("image/jpg"); response.setContentLength (image.length); obraz powrotu; } 'Co do" bardziej eleganckiego rozwiązania "- czy nie jest to zbyt skomplikowane dla tak prostego zadania? :) – kumade

6

Problem polega na tym, że trzeba określić rodzaj mime (a jeśli obraz jest większy, trzeba będzie również określić jego długość).

Innym rozwiązaniem() jest zwracają Spring ResponseEntity lub HttpEntity (HttpEntity wystarczy jeśli zawsze zwraca kod stanu HTTP 200, ResponseEntity (podklasą HttpEntity) jest na przykład potrzebne, jeśli chcesz wrócić innych kodów stanu HTTP, jak nie znaleziono).

@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

Dzięki za odpowiedź. Chciałbym skorzystać z Twojego rozwiązania, ale nie mogę tego zrobić w mojej wersji Spring (3.0.1.RELEASE). HttpEntity i ResponseEntity pochodzą z wersji 3.1.x, prawda? – kumade

+0

'HttpEntity' i' ResponseEntity' są wprowadzone w 3.0.2 – Ralph

+0

Widzę, ale w każdym razie nie mogę go użyć, ponieważ nie mogę uaktualnić do wersji 3.0.2. Czy są jakieś podobne rzeczy w 3.0.1? – kumade

Powiązane problemy