Grails - 无法提交base64 img

时间:2012-10-08 05:18:53

标签: ajax grails base64

我需要让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,不知道是否有此事。

非常感谢。

1 个答案:

答案 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)

应该工作!