5

Web アプリケーションに Spring 3.0.1.RELEASE を使用しており (アップグレードする方法がありません)、Web ページのデータベースからいくつかの画像をレンダリングしようとしています。

次の簡単な Spring 構成があります。

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>

春-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>

私は次のコントローラーを持っています:

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

最後に、単純な jsp ページがあります。

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

このページを開くと、この画像は問題なく表示されます。

しかし、画像の「src」属性をコピーしてブラウザーのアドレスバー (Firefox 19.0.2) に貼り付けると、ブラウザーは単に画像をレンダリングするのではなく、carPhoto.html を保存するように勧めてきます。追加のセットアップを実行する必要がありますか?

4

2 に答える 2

6

問題は、MIME タイプを指定する必要があることです (画像が大きい場合は、その長さも指定する必要があります)。

もう 1 つの解決策 () は、SpringResponseEntityを返すか、またはHttpEntity(http ステータス コード 200 を常に返す場合は HttpEntity で十分です。たとえば、見つからないなどの他の http ステータス コードを返したい場合は、ResponseEntity (HttpEntity のサブクラス) が必要です)。

@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);
    }
}
于 2013-03-30T08:55:40.917 に答える
2

いくつかの方法があります。最も簡単なのは、戻り値の型として byte[] を指定して @ResponseBody を使用し、Content-Type などを設定して、HttpServletResponse を使用してバイトを出力ストリームに書き込むことです。

より洗練された解決策 (IMO) は、ModelAndView を返し、その View をカスタム ビューに設定して、適切なヘッダー (Content-Type など) を設定し、バイトを HttpServletResponse の出力ストリームに書き出すことです。


于 2013-03-29T14:20:56.583 に答える