【问题标题】:GWT - image from databaseGWT - 来自数据库的图像
【发布时间】:2011-05-13 17:17:54
【问题描述】:

我实际上正在开发一个基于 GWT 的网站。 现在我不知道应该如何在我的网站上显示存储在数据库中的图像。

基本上,我的数据库中有一个字节数组,我使用 hibernate 获取它。 现在我应该用这些数据创建一个 ... 标签,但我不知道如何

我在 Java 和 Hibernate 中使用 GWT

【问题讨论】:

  • +1 .. 因为每个 gwt 开发人员都会遇到这个问题。

标签: java database image gwt


【解决方案1】:

这里是解决方案。首先,您应该使用 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); 
} 

【讨论】:

  • 在这个调用 RootPanel.get("image");以及如何在 uibinders 和 action dispatch 中做同样的事情。
  • @Bennet image 这里是gwt项目的html页面中创建的div标签的id。
【解决方案2】:

我不知道 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();

【讨论】:

  • 那个似乎很合理。在“普通”JSP 或 PHP 或任何主页中,您也必须执行类似的操作。还是?
  • 无论视图/模板技术如何,您都可以从“浏览器”发出请求。它是一个简单的 HTTP 请求。它也应该适用于 Ajax。
  • 一个很棒的 balusc 关于通过 servlet 提供图像的教程:balusc.blogspot.com/2007/04/imageservlet.html 这种方法也适用于 Image 小部件
【解决方案3】:

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

就是这样。快乐编码

【讨论】:

  • 好的,我知道那个小部件,但它需要一个我没有的 URL,因为它是数据库中的图像
  • 你应该得到它并将其保存到磁盘 (getBLOB) 然后将它的 url 提供给图像。否则,我认为如果不将其复制到磁盘上,您将无法显示图像
  • > 我认为如果不将其复制到磁盘就无法显示图像 - 是的,您可以在不将图像复制到磁盘的情况下显示图像。您需要做的就是将 blob 返回到 UI。
【解决方案4】:

我使用了与 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    相关资源
    最近更新 更多