2012-04-17 95 views
5

我有一个HTML5 Canvas元素。我需要将画布图像提交给我的服务器。它可以在我尝试过的所有PC浏览器中正常工作,但iOS Safari会在日志文件中出现Out of Memory错误。画布图像几乎是500 KB,因为它是950x323 PNG。以下是我的提交代码的简化版本:iOS的Safari浏览器崩溃,大量发布数据表单提交

$('#imageJSON').val(JSON.stringify(myCanvas)); //I wrote other JSON stringify code. It works 
var d = myCanvas.toDataURL(); 
$('#imageData').val(d); 
$('#myForm').submit(); 

Safari开始提交,但在提交中崩溃了几秒钟。服务器通过请求获取其他数据,但imageData不完整。我尝试将表单enctype更改为“multipart/form-data”,但这没有帮助。

回答

1

您是否试过编写算法将画布图像分解为块?例如,不是在整个画布上调用toDataURL(),而是将画布分解成10到20个不同的部分。将每件作品保存为独立的图像。当您加载画布时,只需将每一块组装到画布上。这与数据包或视频缓冲类似。

+0

嗨Eric,我正在使用你的图书馆动力学!我最终通过AJAX提交,而不是标准的浏览器提交。 Mac WebKit表单提交中存在一个错误。尽管如此,感谢图像块的想法。 – 2012-05-02 17:36:48

3

事实证明,WebKit for Mac中存在内存错误。我将错误提交给webkit.org https://bugs.webkit.org/show_bug.cgi?id=84168。我发现一个替代解决方案是通过AJAX发送数据而不是标准的表单提交。

$('#imageJSON').val(JSON.stringify(myCanvas)); 
var d = myCanvas.toDataURL(); 
$('#imageData').val(d); 
var data = $(form).serialize(); 
$.post(ajaxurl, data, function(r) { 
    // done. handle response. remove loading overlay. 
}); 

工作很好,但它是一种痛苦。我使用javascript(代码未显示)在表单提交后将浏览器定向到适当的页面,并且它模拟标准表单提交,但对用户来说不够流畅。