Я работаю над проектом, где я реализовал пару графиков / диаграмм с использованием библиотеки PHP Rgraph . В моем сценарии для графиков я делаю следующее:
Draw()
. canvas.toDataURL()
. $.post()
. Все в этом решении отлично работает на моем локальном хосте, однако на сервере разработки запрос 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.
У вас есть два варианта,
Попробуйте удалить 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;