Codeigniter validate file before submitting
หายไปนานโครตๆ เลย ยังไม่ได้ตายไปกับหวัด 2009 นะครับ แต่ช่วงนี้มันมีนู่นมีนี่ตลอดเลย ตอนนี้ก็ยังไม่เสร็จ แต่กลัวจะโดนลืมไปซะก่อน เลยขอแวะมาอัพเดท กันสั่งบทความ วันนี้ขอเป็นเรื่อง CI แล้วกันนะครับ
ไม่รู้คนอื่นจะเคยเจอปัญหาแบบเดียวกับผมรึเปล่า คือว่า ผมอยากจะ validate file ก่อน แล้วค่อย submit ไม่ใช่ submit แล้วค่อยมานั่งตรวจทาน กัน แบบนี้มันไม่ประทับใจ ผมก็เลยลองหาวิธีที่คอื่นเค้าใช้แก้กัน ก็ได้มา 2-3 วิธี แต่ลองๆไปแล้ว มันก็ยังไม่ใช่ที่อยากได้อยู่ดี เลยเอาไอ้ที่หาๆ มา ยำๆ กันจนได้เป็นวิธีของตัวเองซึ่งผมคิดว่า Work More เลยเอามาให้ลองกันดูนี่แหละ
เป็นวิธี extends form_validation ของ CI ครับ มาเพิ่ม method ของตัวเองเข้าไป เรามาเริ่มที่ตรงนี้กันก่อนเลยละกัน
1. extends form_validation
Path: application/libraries/MY_Form_validation.php
-
class MY_Form_validation extends CI_Form_validation {
-
-
function required_file($str)
-
{
-
if ($_FILES[$str][’size’] == 0)
-
{
-
return FALSE;
-
}
-
return TRUE;
-
}
-
-
function valid_file_types($str, $vals)
-
{
-
{
-
require_once(APPPATH.‘config/mimes’.EXT);
-
foreach ($allowed_types as $ext)
-
{
-
$mime = $mimes[$ext];
-
{
-
foreach ($mime as $m)
-
{
-
$allows[] = $m;
-
}
-
}
-
else
-
{
-
$allows[] = $mime;
-
}
-
}
-
$file_mime = $file_info[‘mime’];
-
-
{
-
return FALSE;
-
}
-
}
-
return TRUE;
-
}
-
-
}
-
?>
ส่วนนี้ผมเพิ่ม method เข้าไป 2 ตัว คือ require_file, valid_file_types นะครับ (ขอไม่อธิบายการทำงานของโคด ลองแกะดูนะ นิดเดียวเอง)
2. ที่ language ผมจะเพิ่ม ส่วนของ method ใหม่ผมด้วย
Path: application/language/th/form_validation_lang.php
-
<?php
-
#### Old Code ####
-
/* ——— Extended ———-*/
-
$lang[‘required_file’] = "%s ไม่สามารถเว้นว่างได้";
-
$lang[‘valid_file_types’] = "%s มีชนิดไม่ตรงกับที่ได้รับอนุญาติ";
-
?>
ตรงส่วนภาษานี่ของคนอื่นอาจจะอยู่ใน system/language/en/form_validation_lang.php ก็ได้นะครับ แต่พอดีผม copy มาให้มันอ่านที่ application หมดแล้ว
3. ที่ views ส่วนของ form
-
<form method="post" action="/path/form/save" multipart/form-data">
-
<div id="hidden_fields">
-
<input type="hidden" name="file_checker" value="file_upload" />
-
</div>
-
<label><input type="file" name="file_upload" /></label>
-
<lable><input type="submit" value="upload" /></label>
-
</form>
สังเกตุดูดีๆ ผมจะมี hidden ไปตัวนึง โดย value ค่าชื่อของ input file นั่นเอง (เพราะว่า CI มันจะ validate แค่ $_POST)
4. ขั้นตอนการ validation
-
function some_method()
-
{
-
$this->load->library(‘form_validation’);
-
$this->form_validation->set_rules(‘file_checker’, ‘Form Name Here’, ‘required|required_file|valid_file_types[jpg,jpeg,gif,png]‘);
-
if ($this->form_validation->run() == TRUE)
-
{
-
// do something for success case.
-
}
-
else
-
{
-
// do something for handler errors
-
}
-
}
สังเกตุอีกนิดนึงว่า ทำไม ต้องมีค่า required ให้กับ file_checker ด้วย ผมเอาไว้เผื่อในกรณีที่มีคนมือบอน เอา Firebug ไป Remove Element มันออกจะได้ ไม่ต้องผ่านกันไปเลย อิอิ
เท่านี้ก็จบแล้วครับ งาน validate ก่อน upload ของเรา ง่ายใช่มั้ยล่ะ
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
ยังเหลือ method พวก valid file size ก็ไปเขียนเติมเอาตามใจชอบนะครับ
ผมรอบทความจากคุณตั้งนาน นึกว่าเลิกเขียนไปเสียแล้ว ยินดีต้อนรับกลับบ้านครับ
ยังครับ แต่ติดงานเยอะเลยครับ ช่วงนี้คงนานๆ มาอัพเดทที ขอบคุณที่ติดตามนะครับ
มาแวะ ๆ เวียนหลายรอบล่ะครับ ช่วงนี้เจ้าของเว็บคงยุ่งจริงๆ : )ไม่ค่อยเห็นบทความใหม่ๆ เพิ่ม
อิอิ
พี่ Tee++ เป็น idol มห้ผมเลยนะครับ
จะพยายามต่อไป สู้ๆ
แอบตามมาจาก ลายเซ็นต์ใน ไทยเสียวนะครับ บทความดีๆทั้งนั้นเลย
ขอบคุณมากครับ
ลองใช้งานดูแล้วครับ แต่เมื่อผ่านการ validation แล้วมันไม่ทำงานนะครับ
การอัพโหลดก็ใช้วิธีตัวอย่างใน คู่มือ help codeigniter
ตอนที่ให้แสดงข้อมูลของไฟล์ที่อัพโหลดขึ้นไปถึงทราบว่าข้อมูลบางส่วนหายไป
(ใช้ $this->upload->data()) ถ้าเป็นวิธีปกติข้อมูลทุกอย่างใน array ของ $this->upload->data() จะครบ
แต่พอตัว validate ข้อมูลบางส่วนหายไปเช่น width, hight ทั้งๆ ที่เป็นไฟล์รูปภาพ
้ถ้าอย่างไรขอข้อแนะนำด้วยนะครับ ขอบคุณ