使用 Thymeleaf 显示 Base64String 图像

Posted

技术标签:

【中文标题】使用 Thymeleaf 显示 Base64String 图像【英文标题】:Showing Base64String Image with Thymeleaf 【发布时间】:2016-01-07 20:14:57 【问题描述】:

我将 jpg 图像存储在数据库中(作为字节数组)。我想避免在网页上显示之前进入文件系统。

单元测试表明数据库存储和检索工作正常,没有损坏。 Fies可以从数据库中提取并转换回jpg文件

图像被转换为​​字节数组并使用以下代码存储在数据库中:

public static byte[] getImageAsBytes(BufferedImage buffer) throws IOException

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(buffer, "jpg", baos);
    baos.flush();
    byte[] imageInByte = baos.toByteArray();
    baos.close();
    return imageInByte;


我有一个 ViewWrapperMediaImage 类,其中包含从数据库中检索到的字节数组。这个类还有一个方法可以将 bytearray 转换为 base64 String。

package jake.prototype2.controller.viewwrapper;

import org.apache.commons.codec.binary.Base64;

import jake.prototype2.model.assessment.MediaImage;
import jake.prototype2.model.assessment.TestStructureException;
import jake.prototype2.model.structure.InterfacePersistenceBean;

public class ViewWrapperMediaImageCreate extends ViewWrapperTestContentElementCreate


private byte[] image;

protected String mediaFileName;

private static final long serialVersionUID = 4181515305837289526L;

public ViewWrapperMediaImageCreate(InterfacePersistenceBean persistenceBean) throws TestStructureException

    ....
    


public byte[] getImage()

    return image;


public String generateBase64Image()

    return Base64.encodeBase64URLSafeString(this.getImage());


public void setImage(byte[] image)

    this.image = image;


public String getMediaFileName()

    return mediaFileName;


public void setMediaFileName(String mediaFileName)

    this.mediaFileName = mediaFileName;


我的 Thymeleaf tile 然后调用转换方法 generateBase64Image():

<img  th:src="@'data:image/jpeg;base64,'+$vwNewTestContentElement.generateBase64Image()" />

它不起作用。

生成的html源码如下:

 < img src="data:image/jpeg;base64,_9j_4AAQSkZJRgABAgAAAQABAAD_2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL_2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL_wAARCADhASwDASIAAhEBAxEB_8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL_8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4-Tl5ufo6erx8vP09fb3-....

任何提示将不胜感激

【问题讨论】:

【参考方案1】:

好的,事实证明这很容易,我在提出问题后 2 分钟内就解决了,但我敢打赌其他人也会有同样的问题。

答案是不要使用 URLSafe

它适用于encodeBase64String()

【讨论】:

解决了这个问题,你值得 +1 谢谢 :) 显然 Thymeleaf 现在不接受 byte[] 并且它在 html 文件中转换为 Base64,所以在将其设置为上下文变量之前我必须 Base64.getEncoder().encodeToString(byte[]) 你能在这里发布新的答案吗?这个问题似乎得到了很多流量。保持最新会很有帮助

以上是关于使用 Thymeleaf 显示 Base64String 图像的主要内容,如果未能解决你的问题,请参考以下文章

Java将图片转化为base64编码并且通过thymeleaf将图片在页面展示

php Base64编码/解码

[ReactNative] Buffer 使用base64

base64加密linux去除分隔符

day8_base64模块

js中字符串转base64和base64转字符串