Не можете отправить большой HTML5 холст на сервер? - PullRequest
9 голосов
/ 20 февраля 2011

У меня есть холст, на котором ты можешь рисовать. Мне нужно сохранить его содержимое на сервере, чтобы его можно было возобновить позже.

Для этого я xMLHttpReq.send(*) encodeURIComponent(canvasP.toDataURL())* через xMLHttpReq.open("POST", url, false);

В своем скрипте php я беру $ _POST и base64_decode(json_decode($_POST[data])) и сохраняю их в файл .png на сервере.

СЕЙЧАС, это прекрасно работает, если на холсте есть маленький рисунок. НО, если на холсте 1600x1200px нарисовано много материала, и он размером примерно 600 КБ, мой сценарий завершится неудачно, и я получу png на 0 КБ на своем сервере.

Как мне это исправить? Как я могу отправить большой холст на сервер?

Является ли проблема ограничением размера _POST? Потому что, независимо от размера холста, я всегда могу загрузить его через window.open(canvasP.toDataURL(), "blabla");.

Это настоящая дилемма для меня. Любая помощь будет высоко ценится!

[РЕДАКТИРОВАТЬ] PHP просто получает пустое $_POST[data] за что-то более ~ 50 с чем-то кБ ... Таким образом, проблема должна возникать между canvasP.toDataURL() и POST-ing ...

[EDIT2] Браузер говорит «Загрузка ... (xx%)», пока не будет «сделано». ТАК ГДЕ ИДЕТ ДАННЫЕ? : C

[EDIT3] Вот приложение, попробуйте сами (используйте Google Chrome): http://students.info.uaic.ro/~tudor.berechet/

[EDIT4] Кажется, что ответ Майка прав насчет сухозина phpinfo screenshot

1 Ответ

9 голосов
/ 21 февраля 2011

Похоже, ваш php был скомпилирован с Suhosin . ограничение по умолчанию длины для любой почтовой переменной с Suhosin составляет 65000 байт, что довольно близко к тому, что вы оцениваете как ваш предел.

Фактически, ваш сервер отправляет X-Powered-Byзаголовок со значением PHP/5.2.6-1+lenny9.Я погуглил эту версию пакета, и на сайте Debian они упоминают, что она была построена с Suhosin .

Поскольку у вас нет контроля над конфигурацией вашего сервера, решение будет разделить холстДанные в несколько переменных ниже предела длины сообщения вашего сервера, а затем собрать в PHP.Если вы проверите свой phpinfo(), он должен показать все эти ограничения.

Редактировать - Добавлен пример кода

Javascript:

var canvasData = canvasP.toDataURL(); 
var length = canvasData.length;
var content = '';
var index = 0;
var limit = 64999;
var l;
while (length > 0) {
    if (length <= limit)
        l = length;
    else
        l = limit;

    content += '&content[]=' + canvasData.substr(index * limit, l);
    length -= l;
    index++;
}

xhr.send(content);

Не думаю, что вам нужен encodeURIComponent(), который у вас есть, потому что toDataURL() кодируется как base64, что безопасно для URL.

PHP:

if (!empty($_POST['content']) && is_array($_POST['content']))
{
    $content = '';
    foreach ($_POST['content'] as $part)
    {
        $content .= $part;
    }
    $content = base64_decode($content);
}

Не самый эффективный способ сделать это, но он может помочь вам.

У него все еще будут свои ограничения с Suhosin, но вы сможете отправлять намного больше данных таким способом.Похоже, вы будете ограничены 64 частями из 65000 байтов в массиве, прежде чем вам также придется использовать несколько массивов.Однако в этот момент он уже становится слишком большим для того, чтобы большинство людей часто загружали его, и, вероятно, было бы лучше как-то отправить изменения в изображение вместо всего изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...