mon image de magasin de modèles décrite avec le nom de fichier (sous forme de chaîne) et les données (sous forme de tableau d'octets). J'utilise Hibernate et voici mon modèle:
@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;
}
}
Mais je souhaite afficher mon image stockée, sur un site web comme:
<img src="${image.data}" alt="car_image"/>
Comment pourrais-je faire ça?
Dois-je écrire un contrôleur qui traite les demandes d'images?
Des exemples de code?
METTRE À JOUR
<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>
Vous ne pouvez pas faire ça comme ça. Votre image doit être exposée d'une manière ou d'une autre via une URL normale. Dans Spring MVC, créez un contrôleur qui renvoie une image (données brutes) sous une URL particulière:
@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();
}
Maintenant, utilisez-le dans votre page JSP. Voici comment fonctionne HTTP/HTML:
<img src="/yourApp/imageController/42.png" alt="car_image"/>
Dans Spring MVC avant la version 3.1, vous devrez peut-être faire un peu plus de codage côté contrôleur. Mais le principe est le même.
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);
Maintenant, utilisez-le dans votre page JSP comme suit
<img src="data:image/jpeg;base64,${image}" alt="..." width="200" height="200">`
Vous devrez peut-être vérifier ceci post . J'ai un problème similaire comme vous et la solution est de convertir le tableau d'octets en chaîne et de le définir dans la balise img comme ci-dessous,
<img src="data:image/jpg;base64,<c:out value='${bean.imageByteArrayString}'/>" />
Je cherchais la bonne réponse pendant quelques jours, alors j'écrirai la bonne pour moi:
Mon image est déjà enregistrée dans la base de données:
@Entity
@Table(name="PRODUCT")
public class Product {
@Lob
@Column(name="IMG")
private byte[] img;
// setters getters etc
}
Maintenant dans ma classe, par exemple ShowPicture, je dois le lire:
String encodedImage = Base64.encode(product.getImg());
//setters and getters encodedImage
Puis ma page jsp:
<img src='data:image/jpg;base64,<s:property value='encodedImage'/>' alt="my image" />
Aussi simple que cela ! :)
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();
Peut-être qu'il est tard, mais ici je laisse quelque chose qui m'a servi et peut-être que quelqu'un peut m'aider.
J'utilise également Spring MVC et Hibernate
Dans le model (entity class) créez une variable de type String pour effectuer la conversion de type byte en String avec Base64.
Je l'ai fait pour un tableau de pays que j'ai avec son drapeau respectif, et ce que je voulais c'était lister dans un tableau dans la vue tous les pays et à côté de son drapeau.
Modèle (Entité)
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 - Implements est une interface - AbstractDao est une classe Abstract import 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 - implements est une interface
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();
}
}
Contrôleur
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
}
}
Voir - pays/pays.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>