2012-04-08 14 views
14

Mój model zapisuje obraz opisany nazwą pliku (jako Ciąg) i danymi (jako tablica bajtów). Używam Hibernacja i tu jest mój model:Sprężyna - obraz wyświetlany na pliku 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; 
    } 
} 

Ale chcę wyświetlić mój zapisany obraz, na stronie internetowej, takich jak:

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

Jak mogę to zrobić?

powinienem napisać, że kontroler służyć żądań obrazów?

Jakieś przykłady kodu?


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> 

Odpowiedz

29

Nie można zrobić to w ten sposób. Twój obraz musi być w jakiś sposób odsłonięty przez normalny URL. Wiosną MVC utworzy kontroler, który zwraca obraz (dane surowe) pod konkretnym adresem 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(); 
} 

Teraz użyj na stronie JSP. W ten sposób działa HTTP/HTML:

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

Wiosną MVC przed 3.1 być może trzeba trochę więcej kodowania po stronie sterownika. Ale zasada jest taka sama.

+0

Próbowałem tego rozwiązania, ale dostaję błąd 404. Czy to z powodu mojej konfiguracji widoku używają kafelków? Wprowadziłem konfiguracje do aktualizacji – bontade

+0

W końcu błąd 404 został spowodowany przez mapowanie serwletów, które wyświetlało żądania dla regex * .htm. Twoje rozwiązanie działa! Dzięki! Dzięki: D – bontade

+0

"Wiosna MVC + Hibernate + Maven" w pełni działający przykład: 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

Może zajść potrzeba sprawdzenia tego post. Mam podobny problem jak ty, a rozwiązaniem jest konwersja tablicy bajtowej na ciąg i ustawiony w znaczniku img jak poniżej,

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

Teraz go używać na swojej stronie JSP następujący jako

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

Metoda encodeBase64 (byte []) jest niezdefiniowana dla typu Base64 – Siddharth

4

szukałem fo właściwą odpowiedź na kilka dni, więc będę pisać dobry dla mnie:

Mój obraz jest już zapisany w bazie danych:

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

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

// setters getters etc 
} 

Teraz w mojej klasie na przykład ShowPicture muszę ją przeczytać:

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

Wtedy moja strona JSP:

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

Proste jak! :)

0

Może to późno, ale tutaj mogę zostawić coś, że serwowane mnie, a może ktoś może pomóc.

Używam również MVC wiosny i hibernacji

W modelu (klasy podmiotu) utworzyć zmienną typu String zrobić konwersję typu bajt String z Base64.

Zrobiłem to dla tabeli krajów, które posiadam z odpowiednią flagą, a tym, czego chciałem było wymienić w tabeli w widoku wszystkich krajów i na bok jego flagi.

modelu (jednostki)

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

} 

repozytorium - wykona jest interfejs - AbstractDao jest klasą Streszczenie importu 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 - narzędzia jest interfejsem

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

Controller

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 - kraje/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> 
Powiązane problemy