Php Can';是否将大型html5画布发布到服务器?

Php Can';是否将大型html5画布发布到服务器?,php,javascript,html,canvas,http-post,Php,Javascript,Html,Canvas,Http Post,我有一块画布,你可以在上面画画。我需要将其内容保存到服务器,以便以后可以继续 为此,我通过xMLHttpReq.open(“POST”,url,false)发送encodeURIComponent(canvasP.toDataURL())* 在我的php脚本中,我获取$_POST和base64_decode(json_decode($_POST[data]))并将其保存到服务器上的.png文件中 现在,如果画布上有一个小涂鸦,它就可以很好地工作。但是如果1600x1200px画布上画了很多东西,

我有一块画布,你可以在上面画画。我需要将其内容保存到服务器,以便以后可以继续

为此,我通过
xMLHttpReq.open(“POST”,url,false)发送
encodeURIComponent(canvasP.toDataURL())*

在我的php脚本中,我获取$_POST和
base64_decode(json_decode($_POST[data]))
并将其保存到服务器上的.png文件中

现在,如果画布上有一个小涂鸦,它就可以很好地工作。但是如果1600x1200px画布上画了很多东西,大小大约为600kB,我的脚本就会失败,我的服务器上会有一个0kB的png

我该如何解决这个问题?如何将大画布发送到服务器

这个问题是对帖子大小的限制吗?因为,无论画布有多大,我都可以通过
window.open(canvasP.toDataURL(),“blabla”)下载它

这对我来说是个两难的选择。任何帮助都将不胜感激

[编辑]对于任何超过50 kB的内容,PHP只接收空的
$\u POST[data]
。。。 因此,问题必须发生在canvasP.toDataURL()和POST-ing之间

[EDIT2]浏览器显示“上传…(xx%)”直到“完成”。那么数据去了哪里C

[EDIT3]这是一款应用程序,您可以自己试用(使用谷歌chrome):


[EDIT4]Mike关于suhosin的回答似乎是正确的

听起来很像是用php编译的。使用Suhosin的任何post变量的长度都是65000字节,这非常接近您估计的限制

实际上,您的服务器正在发送
X-Powered-By
头,其值为
PHP/5.2.6-1+lenny9
。我在谷歌上搜索了这个软件包版本,他们在Debian网站上提到了它

由于您无法控制服务器配置,因此解决方案是将画布数据拆分为低于服务器post长度限制的多个变量,然后用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);
if (!empty($_POST['content']) && is_array($_POST['content']))
{
    $content = '';
    foreach ($_POST['content'] as $part)
    {
        $content .= $part;
    }
    $content = base64_decode($content);
}
这不是最有效的方法,但它可能会帮助你


Suhosin仍有其局限性,但您可以通过这种方式发送更多数据。在您还必须使用多个阵列之前,一个阵列中的字节数限制为65000字节的64个部分。然而,在这一点上,对于大多数人来说,它已经变得太大,无法经常上传,因此最好以某种方式将更改发送到图像,而不是整个图像。

它在PHP端失败的消息是什么?听起来像是脚本中的内存问题…您的服务器的
post\u max\u大小是多少?发送到服务器的URI编码数据的实际大小是多少?我不知道如何在服务器端检查任何内容,因为我不拥有服务器,除了FTP访问之外,我无法控制它。Sdleihssirhc,那么你是说服务器声明一条Post消息可以持续多长时间?我下载了两个在服务器上失败的图像,495kB和632kB。您可能无法修改首选项,但您始终可以从php读取它们:
ini\u get('post\u max\u size')
您需要尝试并从php脚本中获得反应。在某个地方肯定会有一个响应体。我敢打赌,它包含PHP错误。谢谢您,先生。我自己对服务器端的东西不是很有经验。所以现在我必须把这个字符串分成有趣的。。。从来没有想过,php构建可能会有限制。我不确定除了发布数据之外,还有什么更简单的方法可以发送数据,但你不一定要发布多个帖子。您只需在单个POST中发送多个变量,每个变量小于65000字节。只要所有值的总和低于您的
post\u max\u size
限制,您就可以了。我已经更新了我的答案,你可以用一个可能的方法来做这件事,它是未经测试,但是,所以我不知道它是否会工作。当然,如果你能在没有安装Suhosin的情况下获得一些主机,那会更好,但这并不总是可能的。现在我明白了!我原以为苏霍辛会将12米的限制改写为最大尺寸。非常感谢您提供的示例代码。我现在一定会让它工作的。我使用的是
encodeURIComponent()
,因为除了画布内容之外,我还向发送的数据添加了一个不同的变量,其中包含一个URL…@我自己,大家都知道,
encodeURIComponent(您的_base64)
。如果没有URI编码,它就无法工作。换句话说,base64似乎不太安全。