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.
sumber
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']
.$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.Jawaban:
Berikut adalah contoh cara mencapai apa yang Anda butuhkan:
1) Gambar sesuatu (diambil dari tutorial kanvas )
2) Konversi gambar kanvas ke format URL (base64)
3) Kirim ke server Anda melalui Ajax
3) Simpan base64 di server Anda sebagai gambar (di sini adalah cara melakukannya di PHP , ide yang sama ada di setiap bahasa. Sisi server di PHP dapat ditemukan di sini ):
sumber
You send it to your server as an ajax request
apakah metode ini memerlukan konfirmasi dari pengguna? Atau saya dapat mengirim gambar dari kanvas ke server secara diam-diam?Saya bermain dengan ini dua minggu lalu, sangat sederhana. Satu-satunya masalah adalah bahwa semua tutorial hanya berbicara tentang menyimpan gambar secara lokal. Beginilah cara saya melakukannya:
1) Saya mengatur formulir sehingga saya bisa menggunakan metode POST.
2) Ketika pengguna selesai menggambar, ia dapat mengklik tombol "Simpan".
3) Ketika tombol diklik saya mengambil data gambar dan memasukkannya ke dalam bidang tersembunyi. Setelah itu saya kirimkan form.
4) Ketika formulir dikirimkan saya punya skrip php kecil ini:
sumber
Saya pikir Anda harus mentransfer gambar di base64 ke gambar dengan gumpalan, karena ketika Anda menggunakan gambar base64, dibutuhkan banyak baris log atau banyak baris akan dikirim ke server. Dengan gumpalan, itu hanya file. Anda dapat menggunakan kode ini di bawah:
Dan kode kanvas di sini:
Setelah itu Anda bisa menggunakan ajax dengan Form:
Kode ini menggunakan sintaks CoffeeScript.
jika Anda ingin menggunakan javascript, silakan tempel kode ke http://js2.coffee
sumber
Kirim gambar kanvas ke PHP:
Berikut skrip PHP:
photo_upload.php
sumber
Jika Anda ingin menyimpan data yang berasal dari
canvas.toDataURL()
fungsi Javascript , Anda harus mengonversi kosong menjadi plusses. Jika Anda tidak melakukan itu, data yang didekodekan rusak:http://php.net/manual/ro/function.base64-decode.php
sumber
Saya telah mengerjakan sesuatu yang serupa. Harus mengubah gambar yang disandikan kanvas Base64 ke
Uint8Array Blob
.sumber
Selain jawaban Salvador Dali:
di sisi server jangan lupa bahwa data datang dalam format string base64 . Ini penting karena dalam beberapa bahasa pemrograman Anda perlu secara eksplisit mengatakan bahwa string ini harus dianggap sebagai byte bukan string Unicode sederhana.
Kalau tidak, decoding tidak akan berfungsi: gambar akan disimpan tetapi itu akan menjadi file yang tidak dapat dibaca.
sumber