Java 尝试为最初由canvas.toDataURL()创建的GAE数据存储中存储的图像提供服务
我有一个由用户绘制的画布 在JavaScript中,我执行以下操作:Java 尝试为最初由canvas.toDataURL()创建的GAE数据存储中存储的图像提供服务,java,javascript,image,google-app-engine,canvas,Java,Javascript,Image,Google App Engine,Canvas,我有一个由用户绘制的画布 在JavaScript中,我执行以下操作: var data = canvas.toDataURL().substr(22); // snipped code that sets up xhr POST to "d/" var params = "img=" + encodeURIComponent(data); xhr.send(params); 我使用substr(22)来删除“data:image/png;base64,” 然后在应用程序引擎中,我会: do
var data = canvas.toDataURL().substr(22);
// snipped code that sets up xhr POST to "d/"
var params = "img=" + encodeURIComponent(data);
xhr.send(params);
我使用substr(22)来删除“data:image/png;base64,”
然后在应用程序引擎中,我会:
doodle.setProperty("img", new Text(req.getParameter("img")));
因此,我将doodle实体的img属性设置为canvas.toDataURL().substr(22)
现在,当我想要检索图像时,我会:
if (debugimg) {
resp.setContentType("text/plain");
resp.getWriter().print(((Text)groove.getProperty("img")).getValue());
}
else {
resp.setContentType("image/png;base64");
resp.getWriter().print(((Text)groove.getProperty("img")).getValue());
}
但对我来说,这个形象永远不会出现
这里有一个例子。我画了这个,可以保存它并用JavaScript呈现它
如果我使用debugimg,将保存以下内容:
但是,当我尝试使用setContentType(“image/png;base64”)甚至“image/png”为其提供服务时,您会得到一张不完整的图片:
我试过几种不同的方法,包括不替换它。有什么想法吗
我尝试使用Blob(),因此存储方式如下:
doodle.setProperty("img", new Blob(req.getParameter("img").getBytes()));
resp.getWriter().print(((Blob)groove.getProperty("img")).getBytes());
[B@1f11e0f
像这样读:
doodle.setProperty("img", new Blob(req.getParameter("img").getBytes()));
resp.getWriter().print(((Blob)groove.getProperty("img")).getBytes());
[B@1f11e0f
但那似乎吐出了这样的东西:
doodle.setProperty("img", new Blob(req.getParameter("img").getBytes()));
resp.getWriter().print(((Blob)groove.getProperty("img")).getBytes());
[B@1f11e0f
在将此字符串用作
image/png
之前,必须对其进行解码,因为它是Base64编码版本
我用Python在本地测试了它,你的
你好解码给定字符串后,code>工作正常。我不知道如何在Java中实现它,但它应该是这样的。这里有三个代码片段,它们通过put to a blob属性在JS端(jpg)对我起到了作用。可能不是最优的,但确实有效。嗯-斯蒂夫
创建画布渲染:
imgFinalData = canvas.toDataURL('image/jpg', 1.0);
POST to GAE的设置变量:
f64 = imgFinalData.substr(imgFinalData.indexOf(',')+1).toString();
Post to GAE(fd是用于存储多个Post变量的数组):
一个是GAE端(Python):
存储POST数据的属性(实体类中的行):
bytes=db.BlobProperty(必需=True,索引=False)
如何处理post数据b/4 put:
data=urllib.unquote(self.request.get('bytes'))
数据=数据。替换(“”,“+”)
字节=base64.b64解码(数据+'='*(4-len(数据)%4))
put的实体语句内的建筑红线:
字节=db.Blob(字节)