Saya sedang mengerjakan proyek seni generatif di mana saya ingin memungkinkan pengguna untuk menyimpan gambar yang dihasilkan dari suatu algoritma. Ide umumnya adalah:
- Buat gambar pada Kanvas HTML5 menggunakan algoritma generatif
- Ketika gambar selesai, izinkan pengguna untuk menyimpan kanvas sebagai file gambar ke server
- Izinkan pengguna mengunduh gambar atau menambahkannya ke galeri potongan-potongan yang dihasilkan menggunakan algoritma.
Namun, saya terjebak pada langkah kedua. Setelah bantuan dari Google, saya menemukan posting blog ini , yang tampaknya persis seperti yang saya inginkan:
Yang mengarah ke kode 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);
}
dan PHP yang sesuai (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);
}
?>
Tapi ini sepertinya tidak melakukan apa-apa sama sekali.
Lebih banyak Googling membuka posting blog ini yang didasarkan pada tutorial sebelumnya. Tidak jauh berbeda, tapi mungkin patut dicoba:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Yang ini membuat file (yay) tetapi rusak dan sepertinya tidak mengandung apa-apa. Tampaknya juga kosong (ukuran file 0).
Adakah sesuatu yang benar-benar jelas saya lakukan salah? Jalur tempat saya menyimpan file saya dapat ditulisi, jadi itu bukan masalah, tapi sepertinya tidak ada yang terjadi dan saya tidak begitu yakin bagaimana cara men-debug ini.
Edit
Mengikuti tautan Salvidor Dali, saya mengubah permintaan AJAX menjadi:
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);
}
Dan sekarang file gambar dibuat dan tidak kosong! Sepertinya jenis konten yang penting dan yang mengubahnyax-www-form-urlencoded
memungkinkan data gambar untuk dikirim.
Konsol mengembalikan string kode base64 (agak besar) dan datafile ~ 140 kB. Namun, saya masih tidak bisa membukanya dan sepertinya tidak diformat sebagai gambar.
$data
dalam kode php kedua) semua yang saya dapatkan adalah baris kosong. Kenapa bisa begitu? Sepertinya mungkin data yang dikirim tidak benar, tetapi tampaknya saya mengirimkannya seperti contoh yang ditunjukkan ...
DataUriUpload
komponennya sebagai gantinya. Itu didokumentasikan di sini dan dilengkapi dengan beberapa cara tambahan untuk validasi dan menegakkan keamanan.
ajax.send(canvasData );
sementara Anda menggunakannya sukaajax.send("imgData="+canvasData);
. Karena itu$GLOBALS["HTTP_RAW_POST_DATA"]
tidak akan seperti yang Anda harapkan, mungkin sebaiknya Anda gunakan$_POST['imgData']
.