Подтвердить что ты не робот

JQuery Возврат вызова AJAX 403 Запрещенная ошибка при передаче данных изображения Rgraph

Я работаю над проектом, где я выполнил пару графиков/диаграмм, используя библиотеку PHP Rgraph. В моем script для графиков я делаю следующее:

  • Вычислите точки графа и нарисуйте график, используя метод Rgraph Draw().
  • Создайте переменную данных изображения с помощью метода canvas.toDataURL().
  • Передайте эту переменную данных изображения на сервер с помощью метода jQuery AJAX $.post().
  • Сохраните изображение на сервере с помощью PHP script.

Все в этом решении отлично работает на моем локальном хосте, однако на сервере разработки запрос AJAX, который передает данные изображения, возвращает 403 Error.

Я зарегистрировал данные как на стороне клиента, так и на стороне сервера, чтобы определить проблему. Ведение журнала на стороне клиента подтверждает, что передаваемая переменная imageData выглядит правильно. Однако ведение журнала на стороне сервера подтверждает, что передаваемая переменная imageData​​strong > является причиной этой проблемы.

В прошлом году был опубликован очень похожий вопрос об этом, однако они не смогли определить основную причину этого. Может ли кто-нибудь помочь мне в правильном направлении разрешить это?

Я думаю, что это возможная проблема кодирования данных, но если это так, почему это работает на одном сервере, а не на другом?

Мой соответствующий 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'
});

Ведение журнала на стороне клиента:

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

Функция PHP, вызываемая AJAX:

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'));
        }
    }
}
4b9b3361

Ответ 1

Предполагая, что CORS здесь не проблема (что звучит не так, как будто дается то, что он отлично работает на вашем localhost и что это похоже на ваш POSTing в тот же домен, из которого вы получили исходный GET), это, вероятно, неправильная конфигурация между Apache на вашем localhost и devbox. Учитывая, что проблема связана только с вашим POST-кодом с кодировкой базы 64, она, вероятно, слишком велика, поэтому apache отклоняет ее.

Per этот SO сообщение, попробуйте установить следующее в вашем php.ini:

post_max_size=20M
upload_max_filesize=20M

или в .htaccess/httpd.conf/virtualhost:

php_value post_max_size 20M
php_value upload_max_filesize=20M

Обратите внимание, что я не могу точно сказать вам, является ли это причиной, пока вы не опубликуете журнал ошибок apache.

Ответ 2

Его сделать с mod_security (модуль Apache) и частью http:// URL.

У вас есть два варианта:

  • Изменить модуль Apache
  • Обходное решение на стороне клиента

Попробуйте удалить imagedata из формы, которую вы публикуете, и она должна отправить.

Источник: 403-on-form-submit

Ответ 3

Ваше использование данных в .post() немного не работает. Если вы пытаетесь передать объект JSON в качестве данных для второго аргумента .post(), вам необходимо правильно сформировать его в строку JSON. Попробуйте обернуть словарь с помощью JSON.stringify(). Это займет ваше значение javascript {key1: value1, key2: value2} и отформатирует его.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

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