GAJAX บทที่ 24 GForm อัปโหลดแบบไม่เปลี่ยนหน้าด้วย GAJAX
โค้ดนี้จะเป็นการใช้ GForm ในการทำอัปโหลดแบบ Ajax ซึ่งจริงๆแล้วเราก็สามารถเขียนฟอร์มได้เหมือนกับฟอร์มทั่วๆไปเหมือนเดิมครับ และหากเราใช้รูปรอโหลด เราก็จะสามารถใช้งานได้คล้ายๆ Upload Progressbar เลยทีเดียว
โค้ดฟอร์มครับ ไม่ีมีอะไรแตกต่างจากฟอร์มทั่วไป และไม่ต้องกำหนด encoding ด้วย
imgupload เป็น tag img สำหรับแสดงรูปดาวน์โหลดที่ได้อัปโหลดไปแล้ว
Javascript ในส่วนของฟอร์มเมื่อ submit ต้องเอาไว้ในหน้าเดียวกับฟอร์มนะครับ
โค้ด upload.php ที่ทำการอัปโหลดไป ซึ่งสามารถเขียนคำสั่งอัปโหลดได้เหมือนฟอร์ม ปกติธรรมดา ในตัวอย่างมีการตรวจสอบชนิดและ ขนาดของไฟล์อัปโหลด ถ้าไม่ถูกต้อง จะคืน error กลับ ถ้าถูกต้อง จะคืนชื่อไฟล์ที่อัปโหลดกลับมาด้วย โดยใช้การส่งค่ากลับแบบ JSON
doUpload ฟังก์ชั่น Javascript สำหรับรับค่าจากฟอร์ม เมื่อ submit ไปเรียบร้อยแล้วและตอบกลับมา ซึ่งสามารถแยกออกเป็นไฟล์ js ได้ครับ เป็นการจัดการกับข้อความ JSON ที่ส่งกลับมาเพื่อแสดงข้อความ alert() หรือ หากมีการส่ง datas[0].image กลับมาด้วย ก็ให้ไปแสดงรูป
ตัวอย่าง
<img id="imgupload" alt="image upload" src="test.jpg" />
<form id="frm_upload" action="upload.php" method="post">
<p class="h"><span>อัปโหลด</span><span id="wait" style="visibility: hidden;color:red;">Loading...</span></p>
<p><label for="file">ฺBrowser :</label><input type="file" id="file" name="file" size="40" maxlength="20" /></p>
<p><input id="submit" type="submit" value="อัปโหลด" /></p>
</form>
โค้ดฟอร์มครับ ไม่ีมีอะไรแตกต่างจากฟอร์มทั่วไป และไม่ต้องกำหนด encoding ด้วย
imgupload เป็น tag img สำหรับแสดงรูปดาวน์โหลดที่ได้อัปโหลดไปแล้ว
<script type="text/javascript">
new GForm('frm_upload', false, 'wait', false).onsubmit(doUpload);
</script>
Javascript ในส่วนของฟอร์มเมื่อ submit ต้องเอาไว้ในหน้าเดียวกับฟอร์มนะครับ
<?php
if (!in_array($_FILES[file][type], array('image/pjpeg', 'image/jpeg', 'image/jpg', 'image/gif', 'image/png'))) {
$ret[] = 'error":"ชนิดของไฟล์ ไม่ถูกต้อง';
} elseif ($_FILES[file][size] > 200 * 1024) {
$ret[] = 'error":"ขนาดของไฟล์ มากกว่า 200 kb.';
} else {
copy($_FILES[file][tmp_name], 'test.jpg');
$ret[] = 'error":"อัปโหลดเรียบร้อย';
$ret[] = 'image":"test.jpg?'.time();
}
// คืนค่าเป็น JSON
echo '[{"'.implode('","', $ret).'"}]';
?>
โค้ด upload.php ที่ทำการอัปโหลดไป ซึ่งสามารถเขียนคำสั่งอัปโหลดได้เหมือนฟอร์ม ปกติธรรมดา ในตัวอย่างมีการตรวจสอบชนิดและ ขนาดของไฟล์อัปโหลด ถ้าไม่ถูกต้อง จะคืน error กลับ ถ้าถูกต้อง จะคืนชื่อไฟล์ที่อัปโหลดกลับมาด้วย โดยใช้การส่งค่ากลับแบบ JSON
<script type="text/javascript">
var doUpload = function(xhr){
try {
var datas = xhr.responseText.toJSON();
if (datas[0].error) {
alert(datas[0].error); // มี error ส่งกลับมา
};
if (datas[0].image) {
$E('imgupload').src = datas[0].image; // มี image ส่งกลับมา
};
} catch (e) {
alert(xhr.responseText); // ถ้าข้อความที่ return มา ไม่ใช่ JSON
};
};
</script>
doUpload ฟังก์ชั่น Javascript สำหรับรับค่าจากฟอร์ม เมื่อ submit ไปเรียบร้อยแล้วและตอบกลับมา ซึ่งสามารถแยกออกเป็นไฟล์ js ได้ครับ เป็นการจัดการกับข้อความ JSON ที่ส่งกลับมาเพื่อแสดงข้อความ alert() หรือ หากมีการส่ง datas[0].image กลับมาด้วย ก็ให้ไปแสดงรูป
ตัวอย่าง