Я работаю над генеративным художественным проектом, в котором я хотел бы позволить пользователям сохранять полученные изображения из алгоритма. Общая идея такова:
- Создайте изображение на холсте HTML5, используя генеративный алгоритм
- Когда изображение будет готово, разрешите пользователям сохранять холст как файл изображения на сервере.
- Разрешить пользователю либо загрузить изображение, либо добавить его в галерею произведений, созданных с использованием алгоритма.
Однако я застрял на втором этапе. После некоторой помощи от Google я нашел этот пост в блоге , который, казалось, был именно тем, что я хотел:
Что привело к коду JavaScript:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var ajax = new XMLHttpRequest();
ajax.open("POST", "testSave.php", false);
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.setRequestHeader("Content-Type", "application/upload");
ajax.send("imgData=" + canvasData);
}
и соответствующий PHP (testSave.php):
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
$imageData = $GLOBALS['HTTP_RAW_POST_DATA'];
$filteredData = substr($imageData, strpos($imageData, ",") + 1);
$unencodedData = base64_decode($filteredData);
$fp = fopen('/path/to/file.png', 'wb');
fwrite($fp, $unencodedData);
fclose($fp);
}
?>
Но это, похоже, ничего не делает.
Еще Googling поднимает этот пост в блоге, который основан на предыдущем уроке. Не сильно отличается, но, возможно, стоит попробовать:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Этот создает файл (yay), но он поврежден и, похоже, ничего не содержит. Он также кажется пустым (размер файла 0).
Есть ли что-то действительно очевидное, что я делаю не так? Путь, где я храню свой файл, доступен для записи, так что это не проблема, но, похоже, ничего не происходит, и я не совсем уверен, как это отладить.
редактировать
Следуя ссылке Сальвидора Дали, я изменил запрос AJAX:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var xmlHttpReq = false;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
ajax.open("POST", "testSave.php", false);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.send("imgData=" + canvasData);
}
И теперь файл изображения создан и не пуст! Кажется, что тип контента имеет значение и что его изменение x-www-form-urlencoded
позволяет отправлять данные изображения.
Консоль возвращает (довольно большую) строку кода base64, а размер файла данных составляет ~ 140 КБ. Тем не менее, я до сих пор не могу открыть его, и он, кажется, не отформатирован как изображение.
$data
во втором php-коде), все, что я получаю, это пустая строка. С чего бы это? Кажется, что, возможно, отправляемые данные не верны, но похоже, что я отправляю их точно так же, как показывают примеры ...
DataUriUpload
компонентом. Это задокументировано здесь и поставляется с несколькими дополнительными средствами проверки и обеспечения безопасности.
ajax.send(canvasData );
пока вы его используетеajax.send("imgData="+canvasData);
. Поэтому$GLOBALS["HTTP_RAW_POST_DATA"]
не будет то, что вы ожидаете, вы, вероятно, должны использовать$_POST['imgData']
.