iOS Safari 因大型帖子数据表单提交而崩溃
Posted
技术标签:
【中文标题】iOS Safari 因大型帖子数据表单提交而崩溃【英文标题】:iOS Safari crashing with large post data form submit 【发布时间】:2012-04-29 01:00:49 【问题描述】:我有一个 html5 Canvas 元素。我需要将画布图像提交到我的服务器。它在我尝试过的所有 PC 浏览器中都能正常工作,但 ios Safari 崩溃并在日志文件中出现内存不足错误。画布图像几乎是 500 KB,因为它是 950x323 PNG。这是我提交代码的简化版本:
$('#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】:事实证明 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(代码未显示)在表单提交后将浏览器引导到适当的页面,它有点模拟标准表单提交,但对用户来说不是那么流畅。
【讨论】:
【参考方案2】:您是否尝试过编写算法将画布图像分解成块?例如,与其在整个画布上调用 toDataURL(),不如将画布分成 10-20 个不同的部分。将每件作品另存为单独的图像。当你加载画布时,只需将每一块组装到画布上。这是一个类似于数据包或视频缓冲的概念。
【讨论】:
嘿,Eric,我正在使用你的 Kinetic 库!我最终通过 AJAX 而不是标准浏览器提交提交。 Mac WebKit 表单提交中有一个错误。不过,感谢您提供图像块的想法。以上是关于iOS Safari 因大型帖子数据表单提交而崩溃的主要内容,如果未能解决你的问题,请参考以下文章
iOS 应用程序因终止原因而崩溃:命名空间 SPRINGBOARD,代码 0x8badf00d