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