2012-04-08 103 views
14

mi modelo de imagen de tienda descrita con el nombre de archivo (como Cadena) y los datos (como matriz de bytes). Yo uso de Hibernate y aquí está mi modelo:Primavera: mostrar imagen en el archivo 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; 
    } 
} 

Pero quiero mostrar mi imagen almacenada, en el sitio web como:

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

¿Cómo podría hacer eso?

¿Debo escribir un controlador que sirva solicitudes de imágenes?

¿Algún código de ejemplo?


ACTUALIZACIÓN

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

Respuesta

29

No puede hacerlo de esta manera. Su imagen debe estar expuesta de alguna manera a través de una URL normal. En Spring MVC crear un controlador que devuelve una imagen (datos brutos) en particular, 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(); 
} 

Ahora Useit en su página JSP. Así es como HTTP/HTML trabajo:

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

En Spring MVC 3.1 antes de que pueda necesitar para hacer un poco más de codificación en el lado del controlador. Pero el principio es el mismo.

+0

He intentado esta solución, pero obtengo el error 404. ¿Es por mi configuración de vista, que usan Azulejos? He puesto configuraciones en la actualización – bontade

+0

Así que, finalmente, el error 404 fue causado por la asignación de servlet, que sirvió solicitudes para regex * .htm. Tu solución funciona! ¡Gracias! Dzięki: D – bontade

+0

Un ejemplo completamente funcional de "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

Es posible que debas comprobar esto post. Tengo un problema similar como usted y la solución es convertir la matriz de bytes de la cadena y está situado en la etiqueta img, como a continuación,

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

Ahora lo uso en su página JSP siguiente como

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

El método encodeBase64 (byte []) no está definido para el tipo Base64 – Siddharth

4

que estaba buscando fo la respuesta correcta para un par de días, por lo que voy a escribir el bueno para mí:

mi imagen ya está registrado en la base de datos:

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

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

// setters getters etc 
} 

Ahora en mi clase, por ejemplo, ShowPicture tengo que leerlo:

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

Entonces mi página JSP:

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

simple como eso! :)

0

Quizás es tarde, pero aquí dejo algo que me sirvió y tal vez alguien puede ayudar.

También estoy utilizando Spring MVC y Hibernate

En el modelo (clase de entidad) crear una variable de tipo String para hacer la conversión de tipo byte a cadena con Base64.

Lo hice para una tabla de países que tengo con su bandera respectiva, y lo que quería era enumerar en una tabla en la vista todos los países y al costado su bandera.

Modelo (Entidad)

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 - implementos es una interfaz - AbstractDao es una clase abstracta importación 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; 
} 

} 

Servicio - implementos es una interfaz

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(); 
} 
} 

controlador

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 
} 

} 

Vista - países/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> 
Cuestiones relacionadas