Intereting Posts
PDO не работает с SSL Почему у меня должно быть значение utf8_decode () моего столбца MySQL, чтобы оно отображалось правильно? Получать переменные в области видимости на каждом уровне backtrace PHP? php – Доступ к переменным в функции, определенной в другой функции? Требовать все файлы в папке htaccess блокирует доступ к каталогу, но разрешает доступ к файлам Использование PHP $ _POST для запоминания опции в поле выбора? Сортировка многомерного ассоциативного массива для определенного ключа по его значению возрастает Проблемы с загрузкой cURL Почтовые данные не поступают RegEx не работает для длинного шаблона. Ограничение стека компилятора JRE PCRE – PHP7 Обнаружение программного обеспечения AdBlocking? Оптимизация географического центра в Картах Google в отношении времени поездки, если он находится внутри воды JQuery Ajax success: function () индекс силы трюма в модели

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

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

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

Все в этом решении отлично работает на моем локальном хосте, однако на сервере разработки запрос AJAX, который передает данные изображения, возвращает 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' }); 

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

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

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

В этом сообщении 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.

Это связано с mod_security (модуль Apache) и http:// частью URL.

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

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

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

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

Ваше использование данных в .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;