2013-03-29 32 views
5

Tôi đang sử dụng Spring 3.0.1.RELEASE cho webapp của tôi (và tôi không có cách nào để nâng cấp nó) và tôi đang cố gắng hiển thị một số hình ảnh từ cơ sở dữ liệu trên trang web.Làm cách nào để trả lại hình ảnh đúng cách trong phản hồi trong ứng dụng Mùa xuân?

Tôi đã sau configs mùa xuân đơn giản:

mùa xuân-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> 

mùa xuân-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> 

Tôi đã sau điều khiển:

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

Và cuối cùng, tôi có trang jsp đơn giản:

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

Nếu tôi mở trang này - Tôi có thể thấy hình ảnh này mà không gặp bất kỳ sự cố nào.

Nhưng nếu tôi sao chép thuộc tính "src" hình ảnh và dán vào thanh địa chỉ của trình duyệt (Firefox 19.0.2) - thì trình duyệt cung cấp cho tôi để lưu carPhoto.html, thay vì chỉ hiển thị hình ảnh. Tôi có nên thực hiện một số thiết lập bổ sung không?

+0

là vấn đề thie giải quyết, nếu có, xin chia sẻ như thế nào, tôi đang phải đối mặt với cùng một vấn đề – Abhilash

Trả lời

2

Có một số cách. Dễ nhất là sử dụng @ResponseBody với một byte [] làm kiểu trả về của bạn, thiết lập Kiểu nội dung của bạn và như vậy, ghi các byte vào luồng đầu ra bằng cách sử dụng HttpServletResponse.

Giải pháp thanh lịch hơn (IMO) là trả về ModelAndView, sau đó đặt Chế độ xem trên chế độ xem tùy chỉnh để đặt tiêu đề phù hợp (Kiểu nội dung và loại) và ghi các byte vào luồng đầu ra của HttpServletResponse .


+0

1 cho việc phân tích các loại mime mất tích, nhưng bạn "giải pháp thanh lịch hơn" là một giải pháp xuân 2.x. Mùa xuân 3.x có một số cách thanh lịch hơn (IMO) (xem câu trả lời của tôi) – Ralph

+0

Cảm ơn bạn đã trả lời nhanh. – kumade

+0

Upss. Không thể chỉnh sửa nhận xét trước của tôi. Cảm ơn bạn đã trả lời nhanh. Tôi đã cố gắng thiết lập loại nội dung nhưng không thành công (Có thể tôi đang làm sai): ' byte công cộng [] getCarPhoto ( @RequestParam Số nguyên hình ảnh, @RequestParam Chuỗi ảnhType, HttpServletResponse response) { byte [] image = image từ db; response.setContentType ("hình ảnh/jpg"); response.setContentLength (image.length); hình ảnh trả về; } 'Đối với 'giải pháp thanh lịch hơn' - không phải là quá phức tạp cho một nhiệm vụ đơn giản như vậy? :) – kumade

6

Vấn đề là bạn phải chỉ định loại mime (và nếu ảnh của bạn lớn hơn, bạn cũng sẽ cần xác định chiều dài).

Một giải pháp khác() là trả về Spring ResponseEntity hoặc HttpEntity (HttpEntity là đủ nếu bạn luôn trả về mã trạng thái http 200, ResponseEntity (một phân lớp của HttpEntity) là ví dụ cần thiết nếu bạn muốn trả về mã trạng thái http khác, như không tìm thấy).

@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

Cảm ơn bạn đã trả lời. Tôi rất thích sử dụng giải pháp của bạn nhưng tôi không thể làm điều đó với phiên bản Spring của tôi (3.0.1.RELEASE). HttpEntity và ResponseEntity là từ 3.1.x, phải không? – kumade

+0

'HttpEntity' và' ResponseEntity' được giới thiệu trong 3.0.2 – Ralph

+0

Tôi thấy, nhưng dù sao tôi không thể sử dụng nó, bởi vì tôi không thể nâng cấp lên 3.0.2. Có điều tương tự nào trong 3.0.1 không? – kumade

Các vấn đề liên quan