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 ) {...} ต่อไปได้เลยครับ 😉

ใส่ความเห็น

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>