2012-04-08 1 views
14

изображение моего магазина модели, описанное с именем файла (как String) и данными (в виде массива байтов). Я использую Hibernate и вот моя модель:Spring - отображает изображение в файле jsp

@Entity 
public class Image { 

    private Long id; 
    private String name; 
    private byte[] data; 

    @Id 
    @GeneratedValue 
    @Column(name = "IMAGE_ID") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(nullable = false, length = 100) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Lob 
    @Column(nullable = false) 
    public byte[] getData() { 
     return data; 
    } 

    public void setData(byte[] data) { 
     this.data = data; 
    } 
} 

Но я хочу показать мое сохраненное изображение, на веб-сайте, как:

<img src="${image.data}" alt="car_image"/> 

Как я могу это сделать?

Должен ли я писать контроллер, обслуживающий запросы на изображения?

Любые примеры кода?


UPDATE

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
</bean> 

<bean id="tilesConfigurer" 
    class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
    <property name="definitions"> 
     <list> 
      <value>/WEB-INF/configs/tiles.xml</value> 
     </list> 
    </property> 
</bean> 

ответ

29

Вы не можете сделать это, как это. Ваше изображение должно быть каким-то образом показано через обычный URL. В Spring MVC создать контроллер, который возвращает изображение (исходные данные) по конкретному URL:

@RequestMapping(value = "/imageController/{imageId}") 
@ResponseBody 
public byte[] helloWorld(@PathVariable long imageId) { 
    Image image = //obtain Image instance by id somehow from DAO/Hibernate 
    return image.getData(); 
} 

Теперь useit на странице JSP. Это как HTTP/HTML работа:

<img src="/yourApp/imageController/42.png" alt="car_image"/> 

В Spring MVC, прежде чем 3.1 вам может понадобиться, чтобы сделать немного больше кодирования на стороне контроллера. Но принцип тот же.

+0

Я попытался это решение, но у меня ошибка 404. Это из-за моей конфигурации вида, использующей Tiles? Я установил конфигурации в обновлении – bontade

+0

Итак, ошибка 404 была вызвана отображением сервлетов, которые обслуживали запросы для регулярного выражения * .htm. Ваше решение работает! Благодаря! Dzięki: D – bontade

+0

Полностью рабочий пример «Spring MVC + Hibernate + Maven»: https://sites.google.com/site/adrienitnotes/java/web-apps---spring-mvc-hibernate/spring-form-image -upload-display-from-database-hibernate-simple-mapping –

0
byte[] img = yourImgEntity.getData(); 
response.setContentType("image/*"); 
response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache"); 
//spring-core's FileCopyUtils 
FileCopyUtils.copy(img, response.getOutputStream()); 

// or just use codes below instead of FileCopyUtils 
//response.getOutputStream().write(img); 
//response.getOutputStream().flush(); 
//response.getOutputStream().close(); 
4

Возможно, вам необходимо проверить это post. У меня аналогичная проблема, как вы и решение преобразовать массив байтов в строку и установить в IMG тег, как показано ниже,

<img src="data:image/jpg;base64,<c:out value='${bean.imageByteArrayString}'/>" /> 
15
File file = new File("home/user/test.jpg"); 
FileInputStream fis=new FileInputStream(file); 
ByteArrayOutputStream bos=new ByteArrayOutputStream(); 
int b; 
byte[] buffer = new byte[1024]; 
while((b=fis.read(buffer))!=-1){ 
    bos.write(buffer,0,b); 
} 
byte[] fileBytes=bos.toByteArray(); 
fis.close(); 
bos.close(); 


byte[] encoded=Base64.encodeBase64(fileBytes); 
String encodedString = new String(encoded); 

ModelMap map = new ModelMap(); 
map.put("image", encodedString); 

Теперь использовать его в вашей странице JSP следующий как

<img src="data:image/jpeg;base64,${image}" alt="..." width="200" height="200">` 
+0

Метод encodeBase64 (byte []) не определен для типа Base64 – Siddharth

4

Я сьюты правильного ответа в течение нескольких дней, так что я буду писать хорошую для меня:

Моим образом уже сохранен в базе данных:

@Entity 
@Table(name="PRODUCT") 
public class Product { 

@Lob 
@Column(name="IMG") 
private byte[] img; 

// setters getters etc 
} 

Теперь в моем классе, например ShowPicture я должен прочитать:

String encodedImage = Base64.encode(product.getImg()); 
//setters and getters encodedImage 

Тогда моя страница JSP:

<img src='data:image/jpg;base64,<s:property value='encodedImage'/>' alt="my image" /> 

Простой, как это! :)

0

Может быть, уже поздно, но здесь я оставляю что-то, что служило мне, и, может быть, кто-то может помочь.

Я также использую Spring MVC и Hibernate

В модели (класс объекта) в создать переменную типа String, чтобы сделать преобразование типа байт в строку с Base64.

Я сделал это для таблицы стран, которые у меня есть со своим соответствующим флагом, и то, что я хотел, было отображать в таблице в виде всех стран и сбоку ее флаг.

Модель (Entity)

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.persistence.Transient; 

@Entity 
@Table(name = "country") 
public class Country implements java.io.Serializable { 

private int id; 
private String name; 
private byte[] flag; 
private String base64; //Variable to store the conversion of a data byte type to String 

@Transient //Annotation so it does not persist in the database 
public String getBase64() { 
    //Convert the data type byte to String, store it in the variable and return it 
    return this.base64 = Base64.encode(this.flag); 
} 

public void setBase64(String base64) { 
    this.base64 = base64; 
} 

public Country() { 
} 

public Country(int id, String name, byte[] flag, String base64) { 
    this.id = id; 
    this.name = name; 
    this.flag = this.flag 
    this.base64 = this.base64; 
} 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id", unique = true, nullable = false) 
public int getId() { 
    return this.id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

@Column(name = "name") 
public String getName() { 
    return this.name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

@Column(name = "flag") 
public byte[] getFlag() { 
    return this.flag; 
} 

public void setFlag(byte[] flag) { 
    this.flag = flag; 
} 

} 

Repository - Реализует представляет собой интерфейс - AbstractDao является классом Абстрактный импорта org.springframework.stereotype.Repository; import application.model.Country; import application.repository.dao.AbstractDao; import application.repository.dao.CountryDao; import org.hibernate.Criteria;

@Repository("countryDao") 
public class CountryDaoImpl extends AbstractDao<Integer, Country> implements CountryDao { 

@Override 
@SuppressWarnings("unchecked") 
public List<Country> listCountries() { 
    Criteria criteria = createEntityCriteria(); //Country.class 
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
    List<Country> listCountries = criteria.list(); 
    return listCountries; 
} 

} 

Service - Реализует интерфейс

import application.model.Country; 
import application.repository.dao.CountryDao; 
import application.service.dao.CountryService; 
import java.util.List; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

@Service("countryService") 
public class CountryServiceImpl implements CountryService { 

@Autowired 
private CountryDao countryDao; 

@Override 
@Transactional(readOnly = true) 
public List<Country> listCountries() { 
    return countryDao.listCountries(); 
} 
} 

Контроллер

import application.model.Country; 
import application.service.dao.CountryService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
@RequestMapping(value = "/countries") 
public class CountryController { 

@Autowired 
private CountryService countryService; 

@RequestMapping(value = "/list", method = RequestMethod.GET) 
public String ListCountries(Model model) { 
    model.addAttribute("listcont", countryService.listCountry()); 
    return "countries/countries"; //view 
} 

} 

View - страны/countries.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<!DOCTYPE html> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    </head> 
    <body> 
    <h3>List Countries</h3> 
    <table> 
     <thead> 
     <tr> 
      <th>Name</th> 
      <th>Flag</th> 
     </tr> 
     </thead> 
     <tbody> 
     <c:forEach items="${listcont}" var="country"> 
     <tr> 
      <td>${country.name}</td> 
      <td><img src="data:image/png;base64,${country.base64}" /></ 
     </tr> 
     </c:forEach> 
     </tbody> 
    </table> 
    </body> 
</html>