Java GWT-来自数据库的图像

Java GWT-来自数据库的图像,java,database,image,gwt,Java,Database,Image,Gwt,我实际上在一个基于GWT的网站上工作。 现在我被困在如何在我的网站上显示存储在数据库中的图像上 基本上,我的数据库中有一个bytearray,我使用hibernate获取它。 现在我应该创建一个。。。标记出数据,但我不知道如何标记 我在Java中使用GWT,在GWT中使用Hibernate。您不能在客户端执行此操作,但可以通过调用与服务器通信。然后是简单的积垢应用。在服务器中,使用hibernate连接到数据库,并将图像返回到客户端或其url,然后在客户端执行以下操作: @Override pu

我实际上在一个基于GWT的网站上工作。 现在我被困在如何在我的网站上显示存储在数据库中的图像上

基本上,我的数据库中有一个bytearray,我使用hibernate获取它。 现在我应该创建一个。。。标记出数据,但我不知道如何标记

我在Java中使用GWT,在GWT中使用Hibernate。您不能在客户端执行此操作,但可以通过调用与服务器通信。然后是简单的积垢应用。在服务器中,使用hibernate连接到数据库,并将图像返回到客户端或其url,然后在客户端执行以下操作:

@Override
public void onSuccess(String imageUrl) {
    Image image = new Image(imageUrl);
    RootPanel.get("image").add(image);
}

@Override
public void onFailure(Throwable caught) {
    Window.alert(caught.getMessage());
}

就这些。快乐编码

以下是解决方案。首先,应该使用com.google.gwt.user.server.Base64Utils.toBase64(字节[])对字节数组进行编码。但这种方法不适用于IE7。IE8有32kb的限制。。IE9没有这个限制

下面是服务器上的方法

public String getImageData(){
      String base64 = Base64Utils.toBase64(imageByteArray); 
      base64 = "data:image/png;base64,"+base64;
      return base64;
}
这里是客户端方法

@Override 
public void onSuccess(String imageData) {     
    Image image = new Image(imageData);     
    RootPanel.get("image").add(image); 
} 

我不知道GWT是如何工作的,尽管您可以映射一个返回resourceStream的servlet/控制器。 例如,如果您映射一个servlet“imageViewer”,它接受imageId参数,则对图像的请求将变为

/imageViewer?imageId=1234
Hibernate对象将引用blob,因此可以返回该blob。 用户界面上的参考将是

<img src="/imageViewer?imageId=1234"/>

我使用了与Gursel Koca建议的相同的方法,但只能使用ApacheBase64库,而不是(讽刺的)GWT Base64Utils使其工作

String base64 = Base64.encodeBase64String(array);
base64 = "data:image/"+type+";base64," + base64;
return base64;
另外请注意,如果您正在更新现有图像或图像占位符,setURL方法将覆盖您的样式表,因此请确保首先获取该内容:

String styleName = profilePicture.getStyleName();
profilePicture.setUrl(base64String);
profilePicture.setStyleName(styleName);

好的,我知道这个小部件,但它需要一个URL,我没有,因为它是数据库中的一个图像。你应该获取它并将其保存到磁盘(getBLOB),然后将它的URL提供给该图像。否则,我认为你不能显示图像,我的意思是不将其复制到磁盘>我认为你不能显示图像,我的意思是不将其复制到磁盘-是的,你可以显示图像,而不将其复制到磁盘上。您所需要做的就是将blob返回到UI。+1。。因为每一个gwt开发者都会遇到这个问题。这个问题看起来很合理。在“普通”JSP或PHP或任何主页中,您也必须这样做。或者?您可以从“浏览器”发出请求,而不考虑视图/模板技术。这是一个简单的HTTP请求。这是balusc关于通过servlet提供图像的一个很好的教程:这种方法也适用于图像小部件在这个调用RootPanel.get(“图像”)中“图像”是什么意思(它是什么标记);以及如何在uibinders和action dispatch中执行相同的操作。@Bennet
image
这是在gwt项目的html页面中创建的div标记的id。
String styleName = profilePicture.getStyleName();
profilePicture.setUrl(base64String);
profilePicture.setStyleName(styleName);