เนื้อหาต่อไปนี้ เป็นบันทึกช่วยจำ เกี่ยวกับการประยุกต์ใช้งาน FormData Object จะสามารถใช้งาน
ได้เฉพาะในบราวเซอร์รุ่นใหม่ๆ เท่านั้น ดูบราวเซอร์ที่สนับสนุนการใช้งาน MLHttpRequest Level 2
รองรับ FormData Object ได้ที่
โดยส่วนใหญ่รองรับการใช้งานแล้ว
ก่อนอื่นมาทบทวนรูปแบบการส่งข้อมูลด้วย ajax แบบเดิม ที่ไม่รองรับ การส่ง input file
การส่งข้อมูลด้วย ajax ที่ไม่รองรับ การส่งค่า input file
ไฟล์ show_data.php สำหรับรับค่าข้อมูลที่ส่งผ่าน ajax (ในที่นี้จะแสดงข้อมูลที่ส่งมาเป็นตัวอย่างเท่านั้น)
<?php
if(isset($_POST["mytext1"])){
echo "<pre>";
print_r($_POST);
print_r($_FILES);
echo "</pre>";
exit;
}
?>
ไฟล์ form_ajax1.php การส่งข้อมูลด้วย ajax
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<br />
<form action="" method="post" enctype="multipart/form-data" name="myform1" id="myform1">
<input type="text" name="mytext1" id="mytext1"><br>
<input type="file" name="pic_upload" id="pic_upload" />
<input type="submit" name="bt_upload" id="bt_upload" value="Submit" />
</form>
<br>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
// เมื่อฟอร์มการเรียกใช้ evnet submit ข้อมูล
$("#myform1").on("submit",function(e){
e.preventDefault(); // ปิดการใช้งาน submit ปกติ เพื่อใช้งานผ่าน ajax
// เตรียมข้อมูล form สำหรับส่ง
var formData = $(this).serialize();
// ส่งค่าแบบ POST ไปยังไฟล์ show_data.php
$.post("show_data.php",formData,function(data){
console.log(data); // ทดสอบแสดงค่า ดูผ่านหน้า console
/*การใช้งาน console log เพื่อ debug javascript ใน chrome firefox และ ie
https://www.ninenik.com/content.php?arti_id=692 via @ninenik
*/ });
});
});
</script>
</body>
</html>
เมื่อเราทดสอบรันโค้ดข้างด้ร โดยเลือกไฟล์ และก็พิมพ์ข้อมูลบางค่าลงไปใน input text
แล้วกดปุ่ม submit จะได้ผลลัพธ์ประมาณนี้
<pre>Array
(
[mytext1] => ทดสอบ
)
Array
(
)
</pre>
สังเกตว่าในส่วนของตัวแปร $_FILES จะไม่มีการส่งค่าเข้ามาด้วย จะส่งข้อมูลมาเฉพาะ
ส่วนของตัวแปร $_POST เพราะการใช้งาน method serialize() จะไม่สามารถส่งข้อมูลจาก input file ได้
การส่งข้อมูลด้วย ajax รองรับ การส่งค่า input file
ต่อไปเรามาดูโค้ดตัวอย่างการส่งค่าด้วย ajax โดยใช้งาน FormData Object รองรับการส่งค่า input file
เราจะใช้ไฟล์ show_data.php ทดสอบตัวเดิม
<?php
if(isset($_POST["mytext1"])){
echo "<pre>";
print_r($_POST);
print_r($_FILES);
echo "</pre>";
exit;
}
?>
ไฟล์ form_ajax2.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<br />
<form action="" method="post" enctype="multipart/form-data" name="myform1" id="myform1">
<input type="text" name="mytext1" id="mytext1"><br>
<input type="file" name="pic_upload" id="pic_upload" />
<input type="submit" name="bt_upload" id="bt_upload" value="Submit" />
</form>
<br>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
// ส่วนของการกำหนดการตั้งค่าการใช้งาน ajax ของ jquery
// เพิ่มเติม https://api.jquery.com/jQuery.ajax/
// กรณีใช้งานอัพโหลดไฟล์ด้วย ajax ต้องกำหนด contentType: false, และ processData: false
$.ajaxSetup({
cache: false,
contentType: false,
processData: false
});
// เมื่อฟอร์มการเรียกใช้ evnet submit ข้อมูล
$("#myform1").on("submit",function(e){
e.preventDefault(); // ปิดการใช้งาน submit ปกติ เพื่อใช้งานผ่าน ajax
// เตรียมข้อมูล form สำหรับส่งด้วย FormData Object
var formData = new FormData($(this)[0]);
// ส่งค่าแบบ POST ไปยังไฟล์ show_data.php
$.post("show_data.php",formData,function(data){
console.log(data); // ทดสอบแสดงค่า ดูผ่านหน้า console
/* การใช้งาน console log เพื่อ debug javascript ใน chrome firefox และ ie
https://www.ninenik.com/content.php?arti_id=692 via @ninenik */
});
});
});
</script>
</body>
</html>
เมื่อเราทดสอบรันโค้ดข้างด้ร โดยเลือกไฟล์ และก็พิมพ์ข้อมูลบางค่าลงไปใน input text
แล้วกดปุ่ม submit จะได้ผลลัพธ์ประมาณนี้
<pre>Array
(
[mytext1] => ทดสอบ form object
[bt_upload] => Submit
)
Array
(
[pic_upload] => Array
(
[name] => fullcalendar1.png
[type] => image/png
[tmp_name] => C:xampptmpphpB569.tmp
[error] => 0
[size] => 36874
)
)
</pre>
จะเห็นว่าในส่วนนี้ เราสามารถส่งค่า input file ผ่าน ajax ได้
จะมีค่าตัวแปร $_POST และ $_FILES ถูกส่งมาด้วย
ซึ่งการใช้งาน formData Object ผ่าน ajax ของ jquery จำเป็นต้องกำหนดค่าเหล่านี้ก่อนเสมอ
// ส่วนของการกำหนดการตั้งค่าการใช้งาน ajax ของ jquery
// เพิ่มเติม https://api.jquery.com/jQuery.ajax/
// กรณีใช้งานอัพโหลดไฟล์ด้วย ajax ต้องกำหนด contentType: false, และ processData: false
$.ajaxSetup({
cache: false,
contentType: false,
processData: false
});
หรือกรณีเราใช้รูปแบบ ajax แบบเต็ม ก็สามารถกำหนดเป้นดังนี้ แทนได้ โดยไม่ต้องกำหนด $.ajaxSetup
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<br />
<form action="" method="post" enctype="multipart/form-data" name="myform1" id="myform1">
<input type="text" name="mytext1" id="mytext1"><br>
<input type="file" name="pic_upload" id="pic_upload" />
<input type="submit" name="bt_upload" id="bt_upload" value="Submit" />
</form>
<br>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
// เมื่อฟอร์มการเรียกใช้ evnet submit ข้อมูล
$("#myform1").on("submit",function(e){
e.preventDefault(); // ปิดการใช้งาน submit ปกติ เพื่อใช้งานผ่าน ajax
// เตรียมข้อมูล form สำหรับส่งด้วย FormData Object
var formData = new FormData($(this)[0]);
// ส่งค่าแบบ POST ไปยังไฟล์ show_data.php รูปแบบ ajax แบบเต็ม
$.ajax({
url: 'show_data.php',
type: 'POST',
data: formData,
/*async: false,*/
cache: false,
contentType: false,
processData: false
}).done(function(data){
console.log(data); // ทดสอบแสดงค่า ดูผ่านหน้า console
/* การใช้งาน console log เพื่อ debug javascript ใน chrome firefox และ ie
https://www.ninenik.com/content.php?arti_id=692 via @ninenik */
});
});
});
</script>
</body>
</html>
กรณีที่สองนี้ ได้ผลลัพธ์เช่นเดียวกันกับ การใช้รูปแบบ $.post ของตัวอย่างก่อนหน้า
จากตัวอย่างข้างต้น เราจะเห็นว่า เป็นการใช้งานข้อมูลทั้งหมดที่อยู่ในฟอร์ม เพิ่มสร้าง formData
โดย fomData Object ยังรองรับการเพิ่มค่าข้อมูลจากภายนอกฟอร์มได้ หรือรองรับค่าที่กำหนด
เพิ่มเติมได้ โดยใช้ method ชื่อว่า append()
รูปแบบการใช้งาน
formData.append("ชื่อตัวแปร","ค่าข้อมูล");
ตัวอย่าง
formData.append("mytext2","ทดสอบข้อมูลเพิ่มเติม");
ตัวอย่างการใช้งาน append() รับค่าข้อมูลนอกฟอร์ม และส่งไปพร้อม formData Object
ไฟล์ form_ajax3.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input type="text" name="mytext2" id="mytext2"><br>
<br />
<form action="" method="post" enctype="multipart/form-data" name="myform1" id="myform1">
<input type="text" name="mytext1" id="mytext1"><br>
<input type="file" name="pic_upload" id="pic_upload" />
<input type="submit" name="bt_upload" id="bt_upload" value="Submit" />
</form>
<br>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
// ส่วนของการกำหนดการตั้งค่าการใช้งาน ajax ของ jquery
// เพิ่มเติม https://api.jquery.com/jQuery.ajax/
// กรณีใช้งานอัพโหลดไฟล์ด้วย ajax ต้องกำหนด contentType: false, และ processData: false
$.ajaxSetup({
cache: false,
contentType: false,
processData: false
});
// เมื่อฟอร์มการเรียกใช้ evnet submit ข้อมูล
$("#myform1").on("submit",function(e){
e.preventDefault(); // ปิดการใช้งาน submit ปกติ เพื่อใช้งานผ่าน ajax
// เตรียมข้อมูล form สำหรับส่งด้วย FormData Object
var formData = new FormData($(this)[0]);
formData.append("mytext2",$("#mytext2").val()); // เพิ่มค่าจากนอกฟอร์ม
// ส่งค่าแบบ POST ไปยังไฟล์ show_data.php รูปแบบ ajax แบบเต็ม
$.post("show_data.php",formData,function(data){
console.log(data); // ทดสอบแสดงค่า ดูผ่านหน้า console
/* การใช้งาน console log เพื่อ debug javascript ใน chrome firefox และ ie
https://www.ninenik.com/content.php?arti_id=692 via @ninenik */
});
});
});
</script>
</body>
</html>
ผลล้พธ์
<pre>Array
(
[mytext1] => ทดสอบ formData
[bt_upload] => Submit
[mytext2] => ข้อมูลนอกฟรอ้ม
)
Array
(
[pic_upload] => Array
(
[name] => fullcalendar1.png
[type] => image/png
[tmp_name] => C:xampptmpphpCAE1.tmp
[error] => 0
[size] => 36874
)
)
</pre>
จะเห็นว่ามีส่วนของข้อมูลจากตัวแปร $_POST['mytext2'] ถูกส่งค่าไปด้วย
เท่านี้เราก็สามารถนำไปประยุกต์ใช้งานเพิ่มเติมได้