codeigniter กับการอัปโหลดครั้งละหลายๆไฟล์

File upload ของ Codeigniter นั้น เข้าใจว่าทำออกมารองรับการอัปโหลดแค่ไฟล์เดียวต่อครั้งเท่านั้น เพราะถ้าในฟอร์มมีการอัปโหลดโดยใช้ช่อง input file แบบ array มันจะทำงานไม่ได้เลยทันที
การแก้ไขก็ค่อนข้างวุ่นเหมือนกัน แต่ถ้ามีตัวอย่างนี้แล้ว การนำไปใช้งานของคุณก็เป็นเรื่องจิ๊บๆเลยครับ 🙂

เริ่มจากสร้าง form สำหรับอัปโหลด ใน controller, views


$this->load->model("multiupload_m");
$this->load->helper("form");
if ( $_POST || isset($_FILES['file']) ) {
    echo "Upload result:<br />\n";
    $this->multiupload_m->upload();
}

echo form_open_multipart("");
echo form_upload("file[]") . "<br />\n";
echo form_upload("file[]") . "<br />\n";
echo form_submit("", "upload") . "<br />\n";
echo form_close("\n");


controller multiupload.php

ตัวอย่างข้างบนคือ โหลด model multiupload_m.php ซึ่งต้องสร้าง model นี้ขึ้นมา แล้วก็โหลด form helper
จากนั้นก็เขียน form upload แบบ array
และเมื่อมีการอัปโหลด มันจะเรียกโมเดลมาทำงาน

 

ในส่วนของ model


    function upload() {
        $config['upload_path'] = dirname(BASEPATH);
        $config['allowed_types'] = "gif|jpg|png|pdf|dwg";
        $config['encrypt_name'] = true;
        $this->load->library('upload', $config);
        $count = count($_FILES['file']['error']);
        for ($i = 0; $i < $count; $i++) {
            $udata = null;
            $pseudo_field_name = '_psuedo_'. 'file' .'_'. $i;
            $_FILES[$pseudo_field_name] = array(
                'name' => $_FILES['file']['name'][$i],
                'size' => $_FILES['file']['size'][$i],
                'type' => $_FILES['file']['type'][$i],
                'tmp_name' => $_FILES['file']['tmp_name'][$i],
                'error' => $_FILES['file']['error'][$i]
            );
            if ( ! $this->upload->do_upload($pseudo_field_name) ) {
                $error = $this->upload->display_errors();
            } else {
                $udata = $this->upload->data();
                $success[$i] = $udata['file_name'];
                $uploadedfile[$i]['name'] = $this->config->item("web_form_attach_path").$success[$i];
                $uploadedfile[$i]['uploadname'] = $_FILES['file']['name'][$i];
            }
        }// end loop upload
        // loop display, insert, update file name
        if ( isset($uploadedfile) && is_array($uploadedfile) ) {
            foreach ( $uploadedfile as $key => $item ) {
                echo $item['uploadname']."<br />\n";
            }
        }
    }


model multiupload_m.php

อธิบายโมเดลข้างบนนี้คร่าวๆคือ นับจำนวน $_FILES ที่อัปโหลดทั้งหมด เอามาวนตั้งแต่ 0 ใหม่เพื่อสร้างจัดเรียง $_FILES[$pseudo_field_name] ใหม่
กลายเป็น _psuedo_file_1, _psuedo_file_2, _psuedo_file_3 ไปเรื่อยๆตามจำนวน input file array
แล้วก็เอามาทำการเรียก $this->upload->do_upload ในทีเดียวเลย
ที่ต้องตั้งค่า $_FILES ใหม่เพราะ library upload ของ codeigniter ไม่สามารถทำงานกับฟอร์ม array ได้นั่นเอง

ทีนี้การจะนำไป insert/update ชื่อไฟล์ลงฐานข้อมูล ก็ทำใน foreach ( $uploadedfile as $key => $item ) {...} ต่อไปได้เลยครับ 😉

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>