Comment retourner une image dans la réponse au Printemps application?
Je m 'aide de Printemps 3.0.1.LIBÉRATION pour ma webapp (et je n'ai aucun moyen de le mettre à niveau) et je suis en train de rendu des images à partir de la base de données sur la page web.
J'ai suivantes Printemps simple configs:
spring-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>
spring-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>
J'ai contrôleur suivant:
@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;
}
}
Et enfin, j'ai simple 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"/>" />
Si j'ai ouvert cette page - je peux voir cette image sans aucun problème.
Mais si je copie l'image attribut "src" et de le coller dans la barre d'adresse du navigateur (Firefox 19.0.2) - ensuite, le navigateur me propose de l'enregistrer carPhoto.html au lieu de rendre l'image.
Dois-je effectuer une configuration supplémentaire?
est ce problème résolu, si oui, merci de partager comment, je suis confronté au même problème
OriginalL'auteur kumade | 2013-03-29
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous devez spécifier le type mime (et si votre image est plus grande, vous devrez indiquer sa longueur aussi).
Une autre solution () est de retourner un Printemps
ResponseEntity
ouHttpEntity
(HttpEntity est suffisant si vous avez toujours retourner le code d'état http 200, ResponseEntity (une sous-classe de HttpEntity) est par exemple nécessaire si vous voulez retourner à d'autres codes d'état http, comme pas trouvé).HttpEntity
etResponseEntity
sont introduits dans 3.0.2Je vois, mais de toute façon je ne peux pas l'utiliser, car je ne peux pas mettre à niveau vers 3.0.2. Existe-il des choses semblables dans 3.0.1 ?
Je ne sais pas tout. Mais je vous recommande fortement de passer du temps sur la mise à niveau au lieu de copier les fonctionnalités de nouvelles versions de vieux une fois (un de plus de 3 ans!)
Hélas, ce n'est pas ma décision de rester sur ce Printemps version (ou la mise à niveau vers une version plus récente). Je suis juste en utilisant ce que j'ai et ne pouvez pas faire quelque chose avec elle 🙂 en tout cas, Merci à Vous et CodeChimp pour les réponses et pour Votre attention.
OriginalL'auteur Ralph
Il existe plusieurs façons. Le plus simple est d'utiliser @ResponseBody avec un byte[] comme votre type de retour, définissez votre Type de Contenu, l'écriture des octets dans le flux de sortie à l'aide de la HttpServletResponse.
Une solution plus élégante (OMI) serait de revenir un ModelAndView, puis définissez le point de Vue d'un affichage personnalisé qui définit le bon en-tête (Content-Type) et écrit les octets à la HttpServletResponse du flux de sortie.
Merci pour la réponse rapide.
Asi. Ne pouvez pas éditer mon précédent commentaire. Merci pour la réponse rapide. J'ai essayé de mettre en place le type de contenu, mais sans succès (Peut-être que je suis en train de faire le mal): "public byte[] getCarPhoto( @RequestParam Entier photoId, @RequestParam Chaîne de photoType, HttpServletResponse response) { byte[] image = image de db; réponse.setContentType("image/jpg"); réponse.setContentLength(de l'image.la longueur); return image; } ` pour 'solution plus élégante est-il pas trop compliqué pour une telle tâche simple? 🙂
Il vous manque de l' @ResponseBody sur votre type de retour. Vous pouvez soit le mettre avant le byte[] ou sur l'ensemble de la méthode.
J'ai juste omis dans mon commentaire, mais en fait je l'ai (comme dans mon code d'origine de l'échantillon) avant de l'ensemble de la méthode.
OriginalL'auteur CodeChimp