Kullanıcıların ortaya çıkan görüntüleri bir algoritmadan kaydetmelerine izin vermek istediğim, üretken bir sanat projesi üzerinde çalışıyorum. Genel fikir:
- Üretken bir algoritma kullanarak HTML5 Canvas'ta görüntü oluşturma
- Görüntü tamamlandığında, kullanıcıların tuvali bir görüntü dosyası olarak sunucuya kaydetmesine izin verin
- Kullanıcının görüntüyü indirmesine veya algoritmayı kullanarak oluşturulan parça galerisine eklemesine izin verin.
Ancak, ikinci adımda takıldım. Google'dan bazı yardımlardan sonra, tam olarak istediğim gibi görünen bu blog gönderisini buldum :
JavaScript koduna neden olan:
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);
}
ve karşılık gelen 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);
}
?>
Ama bu hiçbir şey yapmıyor gibi görünüyor.
Daha fazla googling önceki öğretici dayalı bu blog yazısı açar . Çok farklı değil, ama belki de denemeye değer:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Bu bir dosya (yay) oluşturur, ancak bozuk ve hiçbir şey içermiyor gibi görünüyor. Ayrıca boş görünüyor (dosya boyutu 0).
Yanlış yaptığımı gerçekten açık bir şey var mı? Dosyamı sakladığım yol yazılabilir, bu bir sorun değil, ama hiçbir şey olmuyor gibi görünüyor ve bu nasıl hata ayıklamak gerçekten emin değilim.
Düzenle
Salvidor Dali'nin bağlantısını takiben AJAX talebini şu şekilde değiştirdim:
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);
}
Ve şimdi görüntü dosyası yaratıldı ve boş değil! İçerik türü önemliydi ve x-www-form-urlencoded
görüntü verilerinin gönderilmesine izin verecek şekilde değiştirildiği anlaşılıyor .
Konsol, base64 kodunun (oldukça büyük) dizesini döndürür ve veri dosyası ~ 140 kB'dir. Ancak, hala açamıyorum ve bir görüntü olarak biçimlendirilmemiş gibi görünüyor.
$data
ikinci php kodunda) tüm döndüğüm boş bir satırdır. Neden olsun ki? Görünüşe göre gönderilen veriler doğru değil gibi görünüyor, ancak örneklerin gösterdiği gibi gönderiyorum ...
DataUriUpload
. Burada belgelenmiştir ve güvenliği onaylamak ve uygulamak için birkaç ek yolla birlikte gelir.
ajax.send(canvasData );
sen gibi kullanırkenajax.send("imgData="+canvasData);
. Bu nedenle$GLOBALS["HTTP_RAW_POST_DATA"]
beklediğiniz gibi olmayacak, muhtemelen kullanmalısınız$_POST['imgData']
.