传递Rgraph图像数据时,jQuery AJAX调用返回403 Forbidden错误

McW*_*Web 12 javascript php ajax jquery cakephp

我正在开发一个项目,我使用Rgraph PHP库实现了几个图形/图表.在我的脚本中,我为图表执行以下操作:

  1. 计算图形点并使用Rgraph Draw()方法绘制图形.
  2. 使用该canvas.toDataURL()方法创建图像数据变量.
  3. 使用jQuery AJAX $.post()方法将此图像数据变量传递给服务器.
  4. 通过PHP脚本将图像保存到服务器.

此解决方案中的所有内容在我的localhost上运行良好,但是在开发服务器上,传递图像数据的AJAX请求返回a 403 Error.

我在客户端和服务器端都记录了数据以确定问题.客户端日志记录确认传递的imageData变量看起来正确.但是,服务器端日志记录确认传递的imageData变量是导致问题的原因.

去年有一个非常类似的问题,但他们无法确定这个问题的根本原因.任何人都可以帮我指出解决这个问题的正确方向吗?

我认为这是一个可能的数据编码问题,但如果是这种情况,为什么它在一台服务器而不是另一台服务器上运行?

我的相关Javascript:

radar.Set('chart.contextmenu', [
     ['Get PNG', RGraph.showPNG],
     null,
     ['Cancel', function () {}]
]);

radar.Draw();   

var imageData = radar.canvas.toDataURL("image/png");

console.log('imageData: ' + imageData);
console.log('filename: ' + 'tmpRadar<?php echo $us['UsersSurvey']['user_id']; ?>-<?php echo $survey['Survey']['id']; ?>.png');

$.post("/Surveys/save_chart", { 
    src     : imageData, 
    filename: 'tmpRadar<?php echo $us['UsersSurvey']['user_id']; ?>-<?php echo $survey['Survey']['id']; ?>.png'
});
Run Code Online (Sandbox Code Playgroud)

客户端记录:

imageData: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAYAAACxbcj6AAAgAElEQ…AgQIAAgVECAqxR49YsAQIECBAgQIAAAQIECBAgQKCfwP8CXHJ+WDHVMbcAAAAASUVORK5CYII=
filename: tmpRadar19-1.png
POST http://website.com/Surveys/save_chart 403 (Forbidden)
Run Code Online (Sandbox Code Playgroud)

由AJAX调用的PHP函数:

public function save_chart() {
    if($this->request->is('ajax')) {
        $this->log('request data: '.print_r($this->request->data, true));

        $filename = $this->request->data['filename'];

        $src     = $this->request->data['src'];
        $src     = substr($src, strpos($src, ",") + 1);
        $decoded = base64_decode($src);

        $fp = fopen(WWW_ROOT.'files/graphs/'.$filename,'wb');
        if(fwrite($fp, $decoded)) {
            fclose($fp);
            return json_encode(array('success' => '1'));
        } else {
            fclose($fp);
            return json_encode(array('success' => '0'));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

DIM*_*Sum 2

假设CORS不是这里的问题(这听起来不像是因为它在您的本地主机上工作正常,并且听起来像是您 POST 到您收到原始 GET 的同一个域),这可能是配置错误在本地主机上的 Apache 和 devbox 之间。鉴于问题仅在于您的 Base 64 编码图像 POST,它可能太大,因此 apache 会拒绝它。

根据这篇 SO post,尝试在 php.ini 中设置以下内容:

post_max_size=20M
upload_max_filesize=20M
Run Code Online (Sandbox Code Playgroud)

或者在 .htaccess / httpd.conf / virtualhost 中:

php_value post_max_size 20M
php_value upload_max_filesize=20M
Run Code Online (Sandbox Code Playgroud)

请注意,在您发布 apache 错误日志之前,我无法确定这是否是原因。