Spe*_*ump 9 javascript php html5 canvas http-post
我有一块你可以画的画布.我需要将它的内容保存到服务器,以便以后可以恢复.
要做到这一点,我xMLHttpReq.send(*)将encodeURIComponent(canvasP.toDataURL())*通过xMLHttpReq.open("POST", url, false);
在我的PHP脚本中,我接受$ _POST base64_decode(json_decode($_POST[data]))并将其保存到服务器上的.png文件中.
现在,如果画布上有一个小涂鸦,这可以正常工作.但是如果1600x1200px画布上有大量的东西,它就像600kB大小,我的脚本失败了,我的服务器上有一个0kB的png.
我该如何解决?如何将大画布发送到服务器?
问题是_POST大小的限制吗?因为,无论画布有多大,我总是可以通过它下载它window.open(canvasP.toDataURL(), "blabla");.
这对我来说是一个两难的选择.任何帮助都感激不尽!
[编辑] PHP只是$_POST[data]为大约50 英镑的东西收到空的...所以问题必须发生在canvasP.toDataURL()和POST 之间......
[EDIT2]浏览器说"正在上传...(xx%)"直到它"完成".那么数据在哪里?:C
[EDIT3]这是应用程序,自己试试(使用谷歌浏览器):http://students.info.uaic.ro/~tudor.berechet/
[编辑4]迈克的回答似乎是关于suhosin的 
这听起来很像你的php是用Suhosin编译的.使用Suhosin的任何post变量的默认长度限制为65000字节,这与您估计的限制非常接近.
实际上,您的服务器正在发送X-Powered-By值为的标头PHP/5.2.6-1+lenny9.我用谷歌搜索了这个软件包版本,在Debian网站上他们提到它是用Suhosin构建的.
由于您无法控制服务器配置,因此解决方案是将画布数据拆分为低于服务器发布长度限制的多个变量,然后在PHP中重新组装.如果你检查phpinfo()它应该显示所有这些限制.
编辑 - 添加了示例代码
使用Javascript:
var canvasData = canvasP.toDataURL();
var length = canvasData.length;
var content = '';
var index = 0;
var limit = 64999;
var l;
while (length > 0) {
if (length <= limit)
l = length;
else
l = limit;
content += '&content[]=' + canvasData.substr(index * limit, l);
length -= l;
index++;
}
xhr.send(content);
Run Code Online (Sandbox Code Playgroud)
我不相信你需要encodeURIComponent()你有,因为toDataURL()编码为base64这是url安全.
PHP:
if (!empty($_POST['content']) && is_array($_POST['content']))
{
$content = '';
foreach ($_POST['content'] as $part)
{
$content .= $part;
}
$content = base64_decode($content);
}
Run Code Online (Sandbox Code Playgroud)
这不是最有效的方法,但它可能会对你有所帮助.
这仍然是Suhosin的限制,但你可以通过这种方式发送更多数据.在您还必须使用多个阵列之前,您似乎将限制为阵列中64个65000字节的部分.然而,在这一点上,对于大多数人来说,它经常会变得太大而不能经常上传,并且将更改以某种方式而不是整个图像发送到图像可能会更好.
| 归档时间: |
|
| 查看次数: |
2444 次 |
| 最近记录: |