我正在尝试制作图像上传窗口小部件并将图像存储在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上。
答案 0 :(得分:0)
你有没有试过像:
HTML html = new HTML("<img src=\""+getImageData's result+"\" alt=\"Foo\">");
或者你试过其他B64 util类吗?
其他选项是从您的数据库生成一个网址,并将其传递给您的图片而不是所有B64数据(我们这样做并且效果很好)。
谢谢,
阿道。
答案 1 :(得分:0)
我想知道你为什么要创建自己的上传小部件,而不是使用像gwtupload这样的库,它可以提供很多开箱即用的东西。
无论如何,与你关于如何在ddbb中获取已保存图像的问题相关,我永远不会使用RPC来获取图像并在UI中显示它,而是一个servlet来返回二进制图像,这是正常的方式。
使用RPC有许多警告:
我认为这不在您的查询中,但如果您想在客户端中使用b64中的图像,则可以在任何支持画布的浏览器中执行此操作。
总之,我会遵循干预原则gwtupload:在客户端使用SingleUploader
或MultipleUploader
,在服务器中扩展UploadAction
,并覆盖executeAction()
以保存上传的文件到DDBB和getUploadedFile()
以获取文件。
答案 2 :(得分:0)
您的问题是您使用的是B64的错误实现。由于某些原因,com.google.appengine.api提供的实际B64无法与apache上传器一起使用。相反,您应该使用此http://iharder.net/base64