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

  1. <?php  if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
  2. class MY_Form_validation extends CI_Form_validation {
  3.  
  4.         function required_file($str)
  5.         {
  6.                 if (!isset($_FILES[$str])) return FALSE;
  7.                 if ($_FILES[$str][’size’] == 0)
  8.                 {
  9.                         return FALSE;
  10.                 }
  11.                 return TRUE;
  12.         }
  13.  
  14.         function valid_file_types($str, $vals)
  15.         {
  16.                 if (!isset($_FILES[$str])) return FALSE;
  17.                 if (isset($_FILES[$str]) AND $_FILES[$str][’size’] > 0)
  18.                 {
  19.                         $allowed_types = explode(‘,’, $vals);
  20.                         require_once(APPPATH.‘config/mimes’.EXT);
  21.                         foreach ($allowed_types as $ext)
  22.                         {
  23.                                 $ext = trim(strtolower($ext));
  24.                                 $mime = $mimes[$ext];
  25.                                 if (is_array($mime))
  26.                                 {
  27.                                         foreach ($mime as $m)
  28.                                         {
  29.                                                 $allows[] = $m;
  30.                                         }
  31.                                 }
  32.                                 else
  33.                                 {
  34.                                         $allows[] = $mime;
  35.                                 }
  36.                         }
  37.                         $file_info = getimagesize($_FILES[$str][‘tmp_name’]);
  38.                         $file_mime = $file_info[‘mime’];
  39.  
  40.                         if (!in_array($file_mime, $allows))
  41.                         {
  42.                                 return FALSE;
  43.                         }
  44.                 }
  45.                 return TRUE;
  46.         }
  47.  
  48. }
  49. ?>

ส่วนนี้ผมเพิ่ม method เข้าไป 2 ตัว คือ require_file, valid_file_types นะครับ (ขอไม่อธิบายการทำงานของโคด ลองแกะดูนะ นิดเดียวเอง)

2. ที่ language ผมจะเพิ่ม ส่วนของ method ใหม่ผมด้วย
Path: application/language/th/form_validation_lang.php

  1. <?php
  2. #### Old Code ####
  3. /* ——— Extended ———-*/
  4. $lang[‘required_file’] = "%s ไม่สามารถเว้นว่างได้";
  5. $lang[‘valid_file_types’] = "%s มีชนิดไม่ตรงกับที่ได้รับอนุญาติ";
  6. ?>

ตรงส่วนภาษานี่ของคนอื่นอาจจะอยู่ใน system/language/en/form_validation_lang.php ก็ได้นะครับ แต่พอดีผม copy มาให้มันอ่านที่ application หมดแล้ว

3. ที่ views ส่วนของ form

  1. <form method="post" action="/path/form/save" multipart/form-data">
  2. <div id="hidden_fields">
  3.   <input type="hidden" name="file_checker" value="file_upload" />
  4. </div>
  5. <label><input type="file" name="file_upload" /></label>
  6. <lable><input type="submit" value="upload" /></label>
  7. </form>

สังเกตุดูดีๆ ผมจะมี hidden ไปตัวนึง โดย value ค่าชื่อของ input file นั่นเอง (เพราะว่า CI มันจะ validate แค่ $_POST)

4. ขั้นตอนการ validation

  1. function some_method()
  2. {
  3.   $this->load->library(‘form_validation’);
  4.   $this->form_validation->set_rules(‘file_checker’, ‘Form Name Here’, ‘required|required_file|valid_file_types[jpg,jpeg,gif,png]‘);
  5.   if ($this->form_validation->run() == TRUE)
  6.   {
  7.      // do something for success case.
  8.   }
  9.   else
  10.   {
  11.     // do something for handler errors
  12.   }
  13. }

สังเกตุอีกนิดนึงว่า ทำไม ต้องมีค่า 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.

8 Comments »

 
  • Tee++; says:

    ยังเหลือ method พวก valid file size ก็ไปเขียนเติมเอาตามใจชอบนะครับ

  • platoosom says:

    ผมรอบทความจากคุณตั้งนาน นึกว่าเลิกเขียนไปเสียแล้ว ยินดีต้อนรับกลับบ้านครับ

  • Tee++; says:

    ยังครับ แต่ติดงานเยอะเลยครับ ช่วงนี้คงนานๆ มาอัพเดทที ขอบคุณที่ติดตามนะครับ

  • togethers says:

    มาแวะ ๆ เวียนหลายรอบล่ะครับ ช่วงนี้เจ้าของเว็บคงยุ่งจริงๆ : )ไม่ค่อยเห็นบทความใหม่ๆ เพิ่ม

  • Melloz says:

    อิอิ

    พี่ Tee++ เป็น idol มห้ผมเลยนะครับ
    จะพยายามต่อไป สู้ๆ

  • แอบตามมาจาก ลายเซ็นต์ใน ไทยเสียวนะครับ บทความดีๆทั้งนั้นเลย

  • man says:

    ขอบคุณมากครับ

  • unknow says:

    ลองใช้งานดูแล้วครับ แต่เมื่อผ่านการ validation แล้วมันไม่ทำงานนะครับ
    การอัพโหลดก็ใช้วิธีตัวอย่างใน คู่มือ help codeigniter
    ตอนที่ให้แสดงข้อมูลของไฟล์ที่อัพโหลดขึ้นไปถึงทราบว่าข้อมูลบางส่วนหายไป
    (ใช้ $this->upload->data()) ถ้าเป็นวิธีปกติข้อมูลทุกอย่างใน array ของ $this->upload->data() จะครบ
    แต่พอตัว validate ข้อมูลบางส่วนหายไปเช่น width, hight ทั้งๆ ที่เป็นไฟล์รูปภาพ
    ้ถ้าอย่างไรขอข้อแนะนำด้วยนะครับ ขอบคุณ

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>