ฉันกำลังทำงานในโครงการศิลปะแบบกำเนิดที่ฉันต้องการอนุญาตให้ผู้ใช้บันทึกรูปภาพผลลัพธ์จากอัลกอริทึม แนวคิดทั่วไปคือ:
- สร้างภาพบนผ้าใบ HTML5 โดยใช้อัลกอริทึมกำเนิด
- เมื่อรูปภาพเสร็จสมบูรณ์อนุญาตให้ผู้ใช้บันทึกผืนผ้าใบเป็นไฟล์รูปภาพไปยังเซิร์ฟเวอร์
- อนุญาตให้ผู้ใช้ดาวน์โหลดรูปภาพหรือเพิ่มลงในแกลเลอรีชิ้นส่วนที่ผลิตโดยใช้อัลกอริทึม
อย่างไรก็ตามฉันติดอยู่ในขั้นตอนที่สอง หลังจากความช่วยเหลือจาก 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);
}
?>
แต่นี่ดูเหมือนจะไม่ทำอะไรเลย
Googling เพิ่มเติมเปิดโพสต์บล็อกนี้ซึ่งอิงจากบทช่วยสอนก่อนหน้านี้ ไม่แตกต่างกันมาก แต่อาจลองดู:
$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
ในรหัส php ที่สอง) ทั้งหมดที่ฉันได้รับคือบรรทัดว่าง ทำไมถึงเป็นเช่นนั้น? ดูเหมือนว่าข้อมูลที่ส่งอาจไม่ถูกต้อง แต่ดูเหมือนว่าฉันกำลังส่งข้อมูลเหมือนกับตัวอย่างที่แสดง ...
DataUriUpload
ส่วนประกอบแทน มีการบันทึกไว้ที่นี่และมาพร้อมกับวิธีการตรวจสอบและบังคับใช้ความปลอดภัยเพิ่มเติมหลายประการ
ajax.send(canvasData );
ajax.send("imgData="+canvasData);
ดังนั้นจะไม่เป็นสิ่งที่คุณคาดหวังว่าคุณอาจจะใช้$GLOBALS["HTTP_RAW_POST_DATA"]
$_POST['imgData']