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

时间:2013-06-07 07:11:52

标签: gwt upload

我正在尝试制作图像上传窗口小部件并将图像存储在GWT数据库中,以便以后可以从中读取它。这是代码:

Servlet(HttpServletRequest请求)

/*   */

    iter = upload.getItemIterator(request);
                while (iter.hasNext()) {
                    FileItemStream item = iter.next();
                    InputStream stream = item.openStream();
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    int len;
                    byte[] buffer = new byte[8192];
                    while ((len = stream.read(buffer, 0, buffer.length)) != -1) {
                        out.write(buffer, 0, len);
                    }
                    Blob content = new Blob(out.toByteArray());

/*    */

实体

    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上。

3 个答案:

答案 0 :(得分:0)

你有没有试过像:

HTML html = new HTML("<img src=\""+getImageData's result+"\" alt=\"Foo\">");

或者你试过其他B64 util类吗?

其他选项是从您的数据库生成一个网址,并将其传递给您的图片而不是所有B64数据(我们这样做并且效果很好)。

谢谢,

阿道。

答案 1 :(得分:0)

我想知道你为什么要创建自己的上传小部件,而不是使用像gwtupload这样的库,它可以提供很多开箱即用的东西。

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

使用RPC有许多警告:

  • 您必须将图像转换为base-64字符串,这会增加很多大小
  • RPC机制必须处理客户端和服务器端的大字符串,从而影响性能(序列化/反序列化,转义,内存问题等)。
  • RCP不可缓存,因此客户端将始终下载图像

我认为这不在您的查询中,但如果您想在客户端中使用b64中的图像,则可以在任何支持画布的浏览器中执行此操作。

总之,我会遵循干预原则gwtupload:在客户端使用SingleUploaderMultipleUploader,在服务器中扩展UploadAction,并覆盖executeAction()以保存上传的文件到DDBB和getUploadedFile()以获取文件。

答案 2 :(得分:0)

您的问题是您使用的是B64的错误实现。由于某些原因,com.google.appengine.api提供的实际B64无法与apache上传器一起使用。相反,您应该使用此http://iharder.net/base64