ユーザーがアルゴリズムから得られた画像を保存できるようにしたいジェネレーティブアートプロジェクトに取り組んでいます。一般的な考え方は次のとおりです。
- 生成アルゴリズムを使用して HTML5 Canvas に画像を作成する
- 画像が完成したら、ユーザーがキャンバスを画像ファイルとしてサーバーに保存できるようにします
- ユーザーが画像をダウンロードするか、アルゴリズムを使用して作成された作品のギャラリーに追加できるようにします。
しかし、私は2番目のステップで立ち往生しています。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);
}
?>
しかし、これはまったく何もしていないようです。
さらにグーグルで検索すると、以前のチュートリアルに基づいたこのブログ投稿が表示されます。それほど違いはありませんが、おそらく試してみる価値があります。
$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)。
私が間違っていることは本当に明らかですか?ファイルを保存しているパスは書き込み可能であるため、問題はありませんが、何も起こっていないようで、これをデバッグする方法がよくわかりません。
編集
Salvidor Dali のリンクに従って、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 kB です。ただし、まだ開くことができず、画像としてフォーマットされていないようです。