【发布时间】:2011-05-13 17:17:54
【问题描述】:
我实际上正在开发一个基于 GWT 的网站。 现在我不知道应该如何在我的网站上显示存储在数据库中的图像。
基本上,我的数据库中有一个字节数组,我使用 hibernate 获取它。 现在我应该用这些数据创建一个 ... 标签,但我不知道如何
我在 Java 和 Hibernate 中使用 GWT
【问题讨论】:
-
+1 .. 因为每个 gwt 开发人员都会遇到这个问题。
我实际上正在开发一个基于 GWT 的网站。 现在我不知道应该如何在我的网站上显示存储在数据库中的图像。
基本上,我的数据库中有一个字节数组,我使用 hibernate 获取它。 现在我应该用这些数据创建一个 ... 标签,但我不知道如何
我在 Java 和 Hibernate 中使用 GWT
【问题讨论】:
这里是解决方案。首先,您应该使用 com.google.gwt.user.server.Base64Utils.toBase64(byte[]) 对字节数组进行编码。但是这种方法不适用于 IE 7。而 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);
}
【讨论】:
image 这里是gwt项目的html页面中创建的div标签的id。
我不知道 GWT 是如何工作的,尽管您可以映射一个返回资源流的 servlet/控制器。 例如,如果您映射一个带有 imageId 参数的 servlet“imageViewer”,则对图像的请求将变为
/imageViewer?imageId=1234
Hibernate 对象将引用该 blob,因此您可以返回它。 UI 上的参考是
<img src="/imageViewer?imageId=1234"/>
更新:您可能无法按原样使用模型来返回图像,您需要一个显式控制器或 servlet 来返回流数据。
在 servlet 中你会做类似的事情
// get reference to input stream
InputStream in = hibnerateObject.getImage();
// set MIME type etc
response.setContentType(mimeType);
OutputStream out = response.getOutputStream();
while ((len = in.read(buf)) >= 0)
out.write(buf, 0, len);
in.close();
out.close();
【讨论】:
GWT 中有Image Widget。您不能在客户端执行此操作,但您可以调用 RPC 与服务器通信。然后是简单的 CRUD 应用程序。在服务器中使用休眠连接到数据库并将图像返回给客户端或它的 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());
}
就是这样。快乐编码
【讨论】:
我使用了与 Gursel Koca 建议的方法相同的方法,但只能使用 Apache Base64 库而不是(具有讽刺意味的)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);
【讨论】: