0

我正在尝试制作一个图像上传小部件并将图像存储在 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's result )。我得到的只是一个损坏的图像图标,右键单击它会以字节为单位提供图像代码。我试过比较大小,原始图像大小与 getImageData 方法中读取的大小相同。

感谢阅读,P。

4

3 回答 3

0

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

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

使用 RPC 有很多注意事项:

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

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

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

于 2013-06-09T08:10:45.103 回答
0

您是否尝试过类似的方法:

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

或者您是否尝试过使用其他 B64 实用程序类?

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

谢谢,

阿道夫。

于 2013-06-07T08:16:12.143 回答
0

您的问题是您使用了 B64 的错误实现。由于某些原因,com.google.appengine.api 提供的实际 B64 不适用于 apache 上传器。相反,你应该使用这个http://iharder.net/base64

于 2013-06-14T00:11:11.390 回答