我需要让ajax提交以提交一些数据,包括图像的base64字符串,它是从画布渲染的。
提交时,我会查看Chrome检查器的网络面板,一切正常,在“表单数据”中列出了我要提交的所有数据。
但是在Grails中我无法获取数据,params
中没有任何内容,只有控制器名称和操作名称。因此,我使用简单params.dataName
获得的所有内容都为空。
我想有一些与post请求大小有关的内容,但我不太确定,因为我之前没有ajax。
这是我使用jquery ajax上传的代码:
var imgBase64String = canvas.toDataURL("image/png");
imgBase64String = imgBase64String .replace('data:image/png;base64,', '');
var submitData = $(form).serializeArray();
submitData.push({name: "webImage", value: imgBase64String })
$.ajax({
type: 'POST',
url: '${createLink(action: 'myAction')}',
data: submitData,
dataType: "html",
success: function(data){//Success code},
});
更新
我在服务器端的代码,它在检索params
数据的简单步骤中失败了:
def myAction= {
def paramData = params
log.info "paramData: " + paramData
def url = params.url
def email = params.email
def webImage = params.webImage
log.info "param: url = " + url
log.info "param: email = " + email
log.info "param: webImage = " + webImage
//Other implement code
}
输出:
2012-10-08 16:31:28,988 [http-bio-8080-exec-5] INFO myController - paramData: [action:myAction, controller:myController]
2012-10-08 16:31:28,989 [http-bio-8080-exec-5] INFO myController - param: url = null
2012-10-08 16:31:28,989 [http-bio-8080-exec-5] INFO myController - param: email = null
2012-10-08 16:31:28,989 [http-bio-8080-exec-5] INFO myController - param: webImage = null
我试图提交的base64图片的大小是1998720,不知道是否有此事。
非常感谢。
答案 0 :(得分:0)
我相信您只需将canvas.toDataURL("image/png")
传递到data
方法中的$.ajax()
字段即可。也可以使用$.post()
代替$.ajax()
。所以你的代码应该在js文件中看起来像这样:
$.post('/image/getCanvasImage', //this is your url
{
img : canvas.toDataURL('image/jpeg'),
email : email
}, function(data){
//whatever you wanna do with the returned data
}
);
然后在您的操作中,导入import sun.misc.BASE64Decoder
包,您可以编写此代码以保存画布图像:
def file = params.img.toString().substring((params.img.toString().indexOf(",")+1),params.img.toString().size())
byte[] decodedBytes = new BASE64Decoder().decodeBuffer(file)
def image = new File("mySavedImage.jpg")
image.setBytes(decodedBytes)
应该工作!