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
ส่วนนี้ผมเพิ่ม method เข้าไป 2 ตัว คือ require_file, valid_file_types นะครับ (ขอไม่อธิบายการทำงานของโคด ลองแกะดูนะ นิดเดียวเอง)
2. ที่ language ผมจะเพิ่ม ส่วนของ method ใหม่ผมด้วย
Path: application/language/th/form_validation_lang.php
สังเกตุดูดีๆ ผมจะมี hidden ไปตัวนึง โดย value ค่าชื่อของ input file นั่นเอง (เพราะว่า CI มันจะ validate แค่ $_POST)
4. ขั้นตอนการ validation
ไม่รู้คนอื่นจะเคยเจอปัญหาแบบเดียวกับผมรึเปล่า คือว่า ผมอยากจะ validate file ก่อน แล้วค่อย submit ไม่ใช่ submit แล้วค่อยมานั่งตรวจทาน กัน แบบนี้มันไม่ประทับใจ ผมก็เลยลองหาวิธีที่คอื่นเค้าใช้แก้กัน ก็ได้มา 2-3 วิธี แต่ลองๆไปแล้ว มันก็ยังไม่ใช่ที่อยากได้อยู่ดี เลยเอาไอ้ที่หาๆ มา ยำๆ กันจนได้เป็นวิธีของตัวเองซึ่งผมคิดว่า Work More เลยเอามาให้ลองกันดูนี่แหละ
เป็นวิธี extends form_validation ของ CI ครับ มาเพิ่ม method ของตัวเองเข้าไป เรามาเริ่มที่ตรงนี้กันก่อนเลยละกัน
1. extends form_validation
Path: application/libraries/MY_Form_validation.php
<?php if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
class MY_Form_validation extends CI_Form_validation {
function required_file($str)
{
if (!isset($_FILES[$str])) return FALSE;
if ($_FILES[$str][’size’] == 0)
{
return FALSE;
}
return TRUE;
}
function valid_file_types($str, $vals)
{
if (!isset($_FILES[$str])) return FALSE;
if (isset($_FILES[$str]) AND $_FILES[$str][’size’] > 0)
{
$allowed_types = explode(‘,’, $vals);
require_once(APPPATH.‘config/mimes’.EXT);
foreach ($allowed_types as $ext)
{
$ext = trim(strtolower($ext));
$mime = $mimes[$ext];
if (is_array($mime))
{
foreach ($mime as $m)
{
$allows[] = $m;
}
}
else
{
$allows[] = $mime;
}
}
$file_info = getimagesize($_FILES[$str][‘tmp_name’]);
$file_mime = $file_info[‘mime’];
if (!in_array($file_mime, $allows))
{
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 bla bla bla"; $lang[‘valid_file_types’] = "%s %s bla bla bla"; ?>
ตรงส่วนภาษานี่ของคนอื่นอาจจะอยู่ใน 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 ของเรา ง่ายใช่มั้ยล่ะ

2 comments