JQuery Возврат вызова AJAX 403 Запрещенная ошибка при передаче данных изображения Rgraph
Я работаю над проектом, где я выполнил пару графиков/диаграмм, используя библиотеку PHP Rgraph. В моем script для графиков я делаю следующее:
- Вычислите точки графа и нарисуйте график, используя метод Rgraph
Draw()
.
- Создайте переменную данных изображения с помощью метода
canvas.toDataURL()
.
- Передайте эту переменную данных изображения на сервер с помощью метода jQuery AJAX
$.post()
.
- Сохраните изображение на сервере с помощью PHP script.
Все в этом решении отлично работает на моем локальном хосте, однако на сервере разработки запрос AJAX, который передает данные изображения, возвращает 403 Error
.
Я зарегистрировал данные как на стороне клиента, так и на стороне сервера, чтобы определить проблему. Ведение журнала на стороне клиента подтверждает, что передаваемая переменная imageData выглядит правильно. Однако ведение журнала на стороне сервера подтверждает, что передаваемая переменная imageDatastrong > является причиной этой проблемы.
В прошлом году был опубликован очень похожий вопрос об этом, однако они не смогли определить основную причину этого. Может ли кто-нибудь помочь мне в правильном направлении разрешить это?
Я думаю, что это возможная проблема кодирования данных, но если это так, почему это работает на одном сервере, а не на другом?
Мой соответствующий 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'));
}
}
}
Ответы
Ответ 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;