ユーザーがアルゴリズムから生成された画像を保存できるようにするジェネレーティブアートプロジェクトに取り組んでいます。一般的な考え方は次のとおりです。
- 生成アルゴリズムを使用してHTML5キャンバス上に画像を作成する
- 画像が完成したら、ユーザーがキャンバスを画像ファイルとしてサーバーに保存できるようにします
- ユーザーが画像をダウンロードするか、アルゴリズムを使用して作成された作品のギャラリーに追加できるようにします。
しかし、私は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;
これはファイルを作成しますが(イェイ)、破損していて何も含まれていないようです。また、空のように見えます(ファイルサイズは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です。しかし、それでも開くことができず、画像としてフォーマットされていないようです。
$data
2番目のphpコードで)エコーすると、返されるのは空白行だけです。なぜでしょうか?送信されているデータが正しくないようですが、例のように送信しているようです...
DataUriUpload
コンポーネントを使用することで、PHPコードを簡略化してより堅牢にすることができます。これはここに文書化されており、検証とセキュリティの強制のいくつかの追加手段が付属しています。
ajax.send(canvasData );
、のように使用していますajax.send("imgData="+canvasData);
。したがって$GLOBALS["HTTP_RAW_POST_DATA"]
、期待どおりにはなりません$_POST['imgData']
。おそらくを使用する必要があります。