GWT使用RPC从数据库获取图像并将其显示在UI中

GWT使用RPC从数据库获取图像并将其显示在UI中,gwt,upload,Gwt,Upload,我正在尝试制作一个图像上传小部件,并将图像存储在GWT数据库中,以便以后可以从中读取。代码如下: Servlet(HttpServletRequest) 实体 public class ImageEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Enumerated private Blob image; /* */ RCP

我正在尝试制作一个图像上传小部件,并将图像存储在GWT数据库中,以便以后可以从中读取。代码如下:

Servlet(HttpServletRequest)

实体

    public class ImageEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated
    private Blob image;
/*    */
RCP实施

/*    */

    public String getImageData(Long id){  
        EntityManager em = EMF.get();
        jtwitter.shared.Image image = em.find(jtwitter.shared.Image.class, id);
        Blob blobData = image.getImage();
        System.out.println(blobData.getBytes().length);;
        byte[] imageData = image.getImage().getBytes();
        System.out.println(imageData.length);
        String base64 = Base64Utils.toBase64(imageData);
        base64 = "data:image/png;base64,"+ base64;  
        return base64;  
    } 
public String getImageData(Long id){  
        EntityManager em = EMF.get();
        jtwitter.shared.Image image = em.find(jtwitter.shared.Image.class, id);
        Blob blobData = image.getImage();
        System.out.println(blobData.getBytes().length);;
        byte[] imageData = image.getImage().getBytes();
        System.out.println(imageData.length);
        String base64 = Base64Utils.toBase64(imageData);
        base64 = "data:image/png;base64,"+ base64;  
        return base64;  
    }
/*    */
在客户端,我调用com.google.gwt.user.client.ui.Image img=new Image(getImageData的结果)。我得到的只是一个破碎的图像图标,右键点击它可以得到以字节为单位的图像代码。我尝试过比较大小,原始图像大小与getImageData方法中读取的大小相同

谢谢你的阅读,
P.

您是否尝试过以下方法:

HTML html = new HTML("<img src=\""+getImageData's result+"\" alt=\"Foo\">");
HTML=newhtml(“”);
或者您尝试过其他B64 util类吗

另一个选项是从数据库生成一个url,并将其传递给图像,而不是所有B64数据(我们正在这样做,而且效果很好)

谢谢


Adolfo.

我想知道为什么你想创建自己的上传小部件,而不是使用像这样的库,它提供了很多现成的东西

无论如何,与您关于如何在ddbb中获取保存的图像的问题相关,我永远不会使用RPC获取图像并在UI中显示它,而是使用servlet返回二进制图像,这是多年来的正常方式

使用RPC有许多注意事项:

  • 您必须将图像转换为base-64字符串,这会大大增加大小
  • RPC机制必须处理客户端和服务器端的大字符串,从而影响性能(序列化/反序列化、转义、内存问题等)
  • RCP不可缓存,因此客户端将始终下载映像
我认为这不在您的查询中,但如果您希望在客户端中的b64中显示图像,您可以在任何支持画布的浏览器中执行


总之,我将遵循gwtupload的DRY原则:在客户端使用
SingleUploader
MultipleUploader
,在服务器中扩展
UploadAction
,并重写
executeAction()
将上传的文件保存到DDBB和
getUploadedFile()
获取文件。

您的问题是使用了错误的B64实现。除了我之外,由于某种原因,com.google.appengine.api提供的实际B64不能与apache上传程序一起工作。相反,你应该使用这个

这很有意思,但是你的问题是什么?我想如何不得到一个损坏的图像。实际上这是B64的问题:)我用另一种方法快到最后期限了,所以我没有尝试任何其他方法。但是你让我好奇的是,有没有关于使用servlet加载图像的分步指南呢?gwtupload指南很容易理解。按照示例,它上载图像并将其保存在磁盘中,在内存中维护一个列表。客户端显示这些图像。你唯一要做的就是修改保存文件的代码。
HTML html = new HTML("<img src=\""+getImageData's result+"\" alt=\"Foo\">");