GWT使用RPC从数据库获取图像并将其显示在UI中
我正在尝试制作一个图像上传小部件,并将图像存储在GWT数据库中,以便以后可以从中读取。代码如下: Servlet(HttpServletRequest) 实体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
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不可缓存,因此客户端将始终下载映像
总之,我将遵循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\">");