将图像写入数据库中的jsp

时间:2013-02-15 16:58:32

标签: java jsp spring-mvc

我正在尝试将数据写入数据库中的jsp(保存为BLOB)。 我正在使用spring,在我的控制器中,我确实有图像byte []。

所以我这样做

byte[] imageBytes = dao.getImage(cc);

model.setAttribute("myimage", new String(imageBytes));

在我的jsp中,我有

<img src=data:image/jpg;base64,"<c:out value='${myimage}'/>" alt="my image" />

但我只在我的jsp页面中看到ascii charcaters(如下所示)。

K_&安培; W:???= 5)^ - Øř滋* \ * M 1? ?] ?, Z'我?P 450ž〜v&CenterDot; K + LMS的ΔE。 Q]?一?他/ ?; K] w ^?C?如参见] ??????曲〜 - LZ Z:6 ?? Z = A + E'5???? ???? C. |?WVý - ?? U·Λd克ݭ)A 10 7 $ ????] ??] S 3 BO?Lezhgzn? ? ?E . ?. ] &lt; eOO ?S ?? . ] ? '? ? ?E ?`]ֻd ??? \} U}&GT; TmzhtU |电子} K&gt;有?吨|?????Q]的 Vd的Q GEA ˰* WZI(SHû^ bž〜 ?vmZiq ULF%LZ〜vozi;?!&放大器;FVϨķú޵? üVXX ??ѯ&GT;????W [çֻ的Kt ?????)E b} M克hѯA /?济(3?

我甚至尝试将byte []转换为ByteArrayOutputStream并使用Base64对其进行编码,但没有工作

model.addAttribute("image", Base64.encode(imageBytes));

但是当我使用FileOutputStream将byte []写入文件(myimage.jpg)时,我确实看到了使用老式方式在我的jsp中显示的图像

<img src="../images/myimage.jpg" .... />

5 个答案:

答案 0 :(得分:5)

不幸的是它不起作用。

您需要使用Spring MVC Controller方法,它将您的图像作为byte []写入您的HttpServletResponse类。

示例:

@RequestMapping("/getImage/{id}")
public void getImage(HttpServletResponse response,@PathVariable("id") final String id) throws IOException {
    response.setContentType("image/jpeg");
    byte[] imageBytes = dao.getImage(id);
    response.getOutputStream().write(imageBytes);
    response.getOutputStream().flush();
}

然后在客户端上使用html代码:

<img src="getImage/222" ... />

更新:是的,你可以从Spring 3.1开始使用@ResposneBody注释

注册ByteArrayHttpMessageConverter

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

然后使用你的控制器:

@RequestMapping("/getPhoto/{id}")
public @ResponseBody byte[] getPhoto(@PathVariable("id") final String id) throws IOException {
    byte[] imageBytes = dao.getImage(id);
    return imageBytes;
}

答案 1 :(得分:4)

诀窍是让另一个servlet直接将数据输出到HttpServletResponse.getOutputStream(),并且正如SuKu所说的那样具有适当的内容类型。然后在JSP中,您只需指向图像servlet在<img/>标记中映射到的URL。例如,如果图像servlet映射到/imgServlet,则可以使用类似

的内容
<img src="imgServlet?img=myimage" ... />

尝试类似http://www.avajava.com/tutorials/lessons/how-do-i-return-an-image-from-a-servlet-using-imageio.html

的内容

答案 2 :(得分:0)

如果您喜欢使用ModelAndView,另一个选项是创建一个自定义View对象,该对象设置媒体类型并将图像的字节输出到输出流。这样,如果出现错误,您可以使用ModelAndView轻松设置重定向或返回正常错误甚至是JSP错误页面,例如找不到图像。

答案 3 :(得分:0)

@RequestMapping(value="/imageDisplays/{imageId}")

public void getImage(@PathVariable int imageId,HttpSession session,HttpServletResponse response)  {
    OutputStream oImage;
    try{
            byte[] imageInByte = // get image in byte array
            response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
            oImage=response.getOutputStream();
            oImage.write(imageInByte);
            oImage.flush();
            oImage.close(); 
    }catch(Exception e){
        LOGGER.debug("Request could not be completed at this moment. Please try again.");
        e.printStackTrace();
    }
    }

答案 4 :(得分:0)

这与我正在研究的问题类似。但是,我使用的是长轮询而不是servlet。这是链接stackoverflow.