Я працюю над генеративним арт-проектом, де я хотів би дозволити користувачам зберігати отримані зображення з алгоритму. Загальна ідея:
- Створіть зображення на полотні 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;
Цей створює файл (так), але він пошкоджений і, схоже, нічого не містить. Він також видається порожнім (розмір файлу 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']
.