사용자가 알고리즘에서 결과 이미지를 저장할 수 있도록하는 생성 아트 프로젝트를 진행 중입니다. 일반적인 아이디어는 다음과 같습니다.
- 생성 알고리즘을 사용하여 HTML5 Canvas에서 이미지 만들기
- 이미지가 완료되면 사용자가 캔버스를 이미지 파일로 서버에 저장하도록 허용
- 사용자가 이미지를 다운로드하거나 알고리즘을 사용하여 제작 된 갤러리에 이미지를 추가 할 수 있습니다.
그러나 나는 두 번째 단계에 붙어 있습니다. 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입니다. 그러나 여전히 열 수 없으며 이미지로 형식화되지 않은 것 같습니다.
$data
두 번째 PHP 코드에서)를 반향하면 빈 줄만 반환됩니다. 왜 그런가요? 아마도 데이터가 전송되는 경우에하는 것은 정확하지 않은 것처럼 보인다, 그러나 나는 ... 예를 보여처럼 그것을 보내고있다 나타납니다
DataUriUpload
. 여기에 문서화되어 있으며 유효성을 검사하고 보안을 강화하는 몇 가지 추가 수단이 제공됩니다.
ajax.send(canvasData );
것과 같은 첫 번째 블로그 게시물ajax.send("imgData="+canvasData);
입니다. 따라서$GLOBALS["HTTP_RAW_POST_DATA"]
당신이 기대하는 것이 아닐 것$_POST['imgData']
입니다.