2017-05-25 267 views
1

的圖像。當我試着從一個產品對象爲Base64添加圖像,旁邊似:顯示彈簧啓動休眠和JPA

<tbody> 
     <tr th:each="product : ${products}"> 
     <td><img th:src="@{'data:image/png;base64,' + ${product.image}}" /></td> 
     <td th:text="${product.name}"></td> 
     <td th:text="${product.price}"></td> 
     <td th:if="${product.state==true}" th:text="Activo" style="color:green;"></td> 
     <td th:if="${product.state==false}" th:text="Bloqueado" style="color:red;"></td> 
     <td><a href="#" class="btn btn-info btn-xs" data-toggle="collapse" data-target="#collapse-form">Editar</a><a href="#" class="btn btn-danger btn-xs">Eliminar</a></td> 
     </tr> 
    </tbody> 

{$product.image}的值爲[[email protected],但如果我把在日誌中。信息();這給我看based64 string。我該如何解決它?

這是我的控制器:

@GetMapping("/admin/products") 
public ModelAndView index(){ 

    User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    ModelAndView mvn = new ModelAndView(); 
    mvn.addObject("user",userServiceImpl.getOne(user.getUsername())); 

    List<Product> products = productServiceImpl.getAll(); 

    for(Product product : products) 
    { 
     byte[] encode = Base64.getEncoder().encode(product.getImage()); 
     product.setImage(encode); 
     LOG.info(new String(encode)); 
    } 

    mvn.addObject("products",products); 
    mvn.setViewName(view); 
    LOG.info("Se ha ingresado al controlador de productos"); 
    return mvn; 

} 

enter image description here

+1

您的記錄器只顯示base64編碼,因爲您的代碼執行此操作。查看'LOG.info(new String(encode));'在您的產品循環中 – Pau

+0

https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html#encodeToString-byte :A-,https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html#getUrlEncoder-- –

+0

從理論上講,即使編碼顯示圖像,也沒關係我想要顯示,但問題是當我把這個​​參考$ {product.image}它應該顯示一些東西拉斯本iVBORw0KGgoAAAANSUhEUgAAA58AAADpCAIAAAAs4 ....但只顯示這[B @ 776a398 –

回答

0

當你的產品形象價值:

<img th:src="@{'data:image/png;base64,' + ${product.image}}" /> 

Thymeleaf只是做了你的byte []的toString(),在java中,默認的toString()會得到一些不可讀的值,這就是thymeleaf添加到src中的東西。

從官方DOC:

Object類的toString方法返回由 其中物體是一個實例,所述-SIGN 字符`的類的名稱的字符串@」,以及該對象的散列 代碼的無符號十六進制表示。換句話說,該方法返回一個字符串等於 ,它的值:

的getClass()的getName()+ '@' + Integer.toHexString(hashCode()方法)

所以如果你需要得到相同的記錄器顯示,你可以使用它返回它作爲字符串的方法:

public class Product { 

    //... 
    public String getImageEncoded() { 
     return new String(this.image); 
    } 

} 

然後在thymeleaf使用這種方法:

<img th:src="@{'data:image/png;base64,' + ${product.getImageEncoded()}}" /> 
+0

謝謝!這就解決了你說的話 –