File Uploading Class
คลาสอัพโหลดไฟล์ของ CodeIgniter ยอมให้คุณอัพโหลดไฟล์ , ปรับแต่งค่าได้หลากหลาย , จำกัดประเภทและขนาดไฟล์ได้
แนวทางการใช้งาน
การอัพโหลดไฟล์โดยทั่วไปนั้นจะต้องทำตามขั้นตอนดังนี้
- ฟอร์มอัพโหลดถูกแสดง, ยอมให้ผู้ใช้งานเลือกไฟล์และอัพโหลดมัน
- เมื่อฟอร์มถูกส่งค่า ไฟล์จะถูกอัพโหลดไปยังตำแหน่งที่คุณกำหนดไว้
- ระหว่างทาง ไฟล์จะถูกตรวจสอบเพื่อให้แน่ใจว่ามันถูกยินยอมให้อัพโหลดโดยขึ้นอยู่กับค่าที่คุณตั้งตามความต้องการ
- เมื่อถูกอัพโหลด ผู้ใช้จะเห็นข้อความว่าเสร็จแล้วเรียบร้อย
ในสาธิตขั้นตอนการทำงานนี้นี้คือวิธีการสอนใช้แบบคร่าวๆ และหลังจากนั้นคุณจะเจอข้อมูลเอกสารอ้างอิงเพิ่มเติม
สร้างฟอร์มอัพโหลด
ใช้โปรแกรมจัดการข้อความ(text editor) สร้างไฟล์ที่ชื่อว่า upload_form.php ภายในไฟล์ให้ใส่โค้ดดังนี้ บันทึกแล้วนำมันไปวางไว้ที่โฟลเดอร์ applications/views/
คุณจะสังเกตุได้ว่าเราได้ใช้ผู้ช่วยฟอร์ม(Form Helper) เพื่อสร้างแท็กเปิด โดยการอัพโหลดไฟล์นั้นต้องการฟอร์มที่รองรับหลายส่วน(multipart form) ดังนั้นเราจะใช้ผู้ช่วยสร้างมันขึ้นมาโดยใช้ไวยากรณ์(syntax) ที่เหมาะสมกับคุณ คุณจะสังเกตุได้ว่าเรามีตัวแปร $error ด้วย สิ่งนี้จะช่วยเราให้โชว์ข้อความ ข้อผิดพลาดในกรณีที่ผู้ใช้งานทำบางสิ่งบางอย่างผิด
หน้าที่แสดงเมื่ออัพโหลดไฟล์สำเร็จ
ใช้โปรแกรมจัดการข้อความสร้างไฟล์ที่ชื่อว่า upload_success.php ภายในไฟล์ให้ใส่โค้ดดังนี้ บันทึกแล้วนำมันไปวางไว้ที่โฟลเดอร์ applications/views/
ตัวควบคุมการอัพโหลด
ใช้โปรแกรมจัดการข้อความสร้างไฟล์ที่ชื่อว่า upload.php ภายในไฟล์ให้ใส่โค้ดดังนี้ บันทึกแล้วนำมันไปวางไว้ที่โฟลเดอร์ applications/controllers/
โฟลเดอร์อัพโหลด
คุณต้องการตำแหน่งโฟลเดอร์ที่คุณจะอัพโหลดรูปของคุณ สร้างโฟลเดอร์ที่ไดเรคทอรี่แรกสุดของการติดตั้ง CodeIgniter (root) โดยตั้งชื่อว่า uploads และตั้งค่ายินยอมเป็น 777
ทดลองใช้มัน!
วิธีการทดลองกับฟอร์มของคุณนั้น ให้เข้าเว็บไซต์ของคุณโดย URL จะคล้ายตัวอย่างนี้ ข้อสังเกตุ example.com นั้นเป็นชื่อที่ๆคุณติดตั้ง อาจจะเป็น localhost หรือเว็บไซต์ก็ได้
example.com/index.php/upload/
เมื่อเข้าไปคุณควรจะเห็นฟอร์มอัพโหลด และลองอัพโหลดไฟล์รูปภาพ (เช่น jpg, gif, หรือ png) ถ้าตำแหน่งอัพโหลดในตัวควบคุมของคุณถูกมันควรจะทำงาน
แนะนำเอกสารอ้างอิง
เริ่มต้นใช้คลาสอัพโหลด
เหมือนคลาสอื่นๆใน CodeIgniter คลาสอัพโหลดถูกเริ่มต้นใช้งานได้ในตัวควบคุมโดยใช้ฟังก์ชัน $this->load->library
$this->load->library('upload');
เมื่อคลาสอัพโหลดถูกโหลดขึ้นมาแล้ว เราสามารถใช้งานมันได้ด้วยแบบนี้ $this->upload
ปรับแต่งค่าตามความต้องการ
เหมือนกับไลบรารี่ตัวอื่นๆ คุณจะควบคุมว่าอะไรที่จะถูกยินยอมในการอัพโหลดผ่านการปรับแต่งตามความต้องการคุณนั้น ซึ่งในตัวควบคุมที่คุณสร้างขึ้นก่อนหน้านี้(ตัวข้างบน) คุณได้ตั้งค่าเริ่มต้นไว้แบบนี้
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->load->library('upload', $config);
// หรืออีกทางหนึ่งคุณสามารถตั้งค่าปรับแต่งนั้นโดยการใช้ฟังก์ชัน initialize แทนก็ได้ซึ่งเป็นประโยชน์มากถ้าคุณใช้การโหลดแบบอัพโนมัติแล้วจะเปลี่ยนค่า
$this->upload->initialize($config);
ค่าปรับแต่งด้านบนนั้นจะถูกอธิบายอย่างดีตามตารางค่าปรับแต่งด้านล่างนี้
ค่าปรับแต่ง
ค่าปรับแต่งต่อไปนี้คือสิ่งที่คุณสามารถปรับแต่งได้ โดยค่าทั่วไปนั้นจะถูกใช้เมื่อคุณไม่มีการปรับแต่งเจ้าค่าปรับแต่งตัวนั้น
| Preference | Default Value | Options | Description |
|---|---|---|---|
| upload_path | None | None | ตำแหน่งของโฟลเดอร์ที่ไฟล์อัพโหลดจะนำไปวางไว้ โดยโฟลเดอร์นั้นจะต้องเขียนได้และตำแหน่งจะเป็นแบบความสัมพันธ์หรือเต็มก็ได้ |
| allowed_types | None | None | ประเภท mime เหมือนกันกับประเภทของไฟล์ที่คุณยอมให้อัพโหลด โดยทั่วไปประเภทของไฟล์นั้นสามารถถูกใช้แทนประเภทของ mime ได้ แล้วแบ่งหลายประเภทจากการใช้ pipe (|) |
| file_name | None | ชื่อไฟล์ที่ต้องการ |
ถ้ามีการตั้งค่า CodeIgniter จะเปลี่ยนชื่อไฟล์ที่ถูกอัพโหลดเป็นชื่อนี้ ข้อสังเกตุ:ชื่อไฟล์นั้นไม่ควรจะใส่ประเภทของไฟล์ เช่น test.mp4 |
| overwrite | FALSE | TRUE/FALSE (boolean) | ถ้าตั้งค่าเป็น TRUE ถ้าไฟล์มีชื่อเดียวกับไฟล์ที่คุณกำลังอัพโหลดขึ้นมา มันจะเขียนทับให้ ถ้าคุณตั้งค่าเป็น FALSE จะมีตัวเลขต่อท้ายชื่อไฟล์ที่อัพโหลดขึ้นมานั้นแทนในกรณีที่มันซ้ำเท่านั้น |
| max_size | 0 | None | ขนาดไฟล์สูงสุดที่จะอัพโหลดได้ (ใช้หน่วยเป็น kilobyte) ตั้งค่าเป็นศูนย์สำหรับไม่จำกัดขนาด ข้อสังเกตุ: การติดตั้ง PHP นั้นมีการจำกัดค่าไว้อยู่แล้วซึ่งตั้งอยู่ในไฟล์ php.ini โดยทั่วไปแล้วคือ 2 MB (หรือ 2048 KB) |
| max_width | 0 | None | ขนาดความกว้างสูงสุด(หน่วยเป็น pixels) ที่ไฟล์นั้นจะเป็นได้ ถ้าตั้งค่าเป็นศูนย์คือไม่จำกัด |
| max_height | 0 | None | ขนาดความสูงสูงสุด(หน่วยเป็น pixels) ที่ไฟล์นั้นจะเป็นได้ ถ้าตั้งค่าเป็นศูนย์คือไม่จำกัด |
| max_filename | 0 | None | ความยาวของชื่อไฟล์ที่สามารถถูกตั้งได้ ตั้งค่าเป็นศูนย์คือไม่จำกัด |
| encrypt_name | FALSE | TRUE/FALSE (boolean) | ถ้าตั้งค่าเป็น TRUE ชื่อไฟล์นั้นจะถูกแปลงเป็นสตริงที่ถูกเข้ารหัสแบบสุ่ม สิ่งนี้จะเป็นประโยชน์ถ้าคุณต้องการบันทึกไฟล์ด้วยชื่อที่ไม่สามารถทำให้แยกแยะได้ ด้วยคนที่อัพโหลดมัน |
| remove_spaces | TRUE | TRUE/FALSE (boolean) | ถ้าตั้งค่าเป็น TRUE ที่ว่างที่อยู่ในชื่อไฟล์นั้นจะถูกเปลี่ยนเป็น underscore(_) แทนซึ่งสิ่งนี้เป็นสิ่งที่แนะนำเป็นอย่างมาก |
ตั้งค่าในไฟล์ปรับแต่ง
ถ้าคุณชอบที่จะไม่ตั้งค่าปรับแต่งในรูปแบบด้านบน คุณสามารถนำไปใส่ในไฟล์ปรับแต่งแทนได้ โดยการสร้างไฟล์ที่มีชื่อว่า upload.php เพิ่มอาเรย์ $config ลงไปในไฟล์หลังจากนั้นบันทึกไฟล์ config/upload.php และมันจะถูกใช้อย่างอัตโนมัติ คุณจึงไม่จำเป็นที่จะต้องใช้ฟังก์ชัน $this->upload->initialize ถ้าคุณบันทึกการปรับแต่งของคุณไว้ในไฟล์แล้ว
เอกสารอ้างอิงฟังก์ชัน
ฟังชั่นที่มีให้ใช้งานดังต่อไปนี้
$this->upload->do_upload()
ปฎิบัติหน้าที่อัพโหลดโดยขึ้นอยู่กับค่าปรับแต่งที่คุณตั้ง ข้อสังเกตุ: โดยทั่วไปการอัพโหลดด้วยฟังก์ชันนี้คาดหวังว่าไฟล์จะมาจากฟอร์มฟิลด์ที่เรียกว่า userfile และฟอร์มจะต้องถูกตั้งค่าเป็นแบบหลายส่วน (multipart)
<form method="post" action="some_action" enctype="multipart/form-data" />
ถ้าคุณชอบที่จะตั้งชื่อฟิลด์ของตัวเอง คุณสามารถส่งชื่อฟิลด์นั้นไปผ่านฟังก์ชัน do_upload ได้เหมือนกัน
$field_name = "some_field_name";
$this->upload->do_upload($field_name)
$this->upload->display_errors()
คืนค่ามาเป็นข้อความผิดพลาดต่างๆถ้าฟังก์ชัน do_upload() คืนค่าเป็นเท็จ(false) ฟังก์ชันจะไม่ echo อย่างอัตโนมัติ มันจะคืนค่าเป็นข้อมูลดังนั้นคุณสามารถจัดการได้ตามที่คุณต้องการ
จัดรูปแบบข้อความข้อผิดพลาด
โดยปกติฟังก์ชันนี้จะถูกคลอบด้วยแท็กแต่ละข้อผิดพลาดด้วย <p> ซึ่งคุณสามารถตั้งเป็นค่าอื่นได้ตามคุณต้องการ โดยมีลักษณะดังนี้
$this->upload->display_errors('<p>', '</p>');
$this->upload->data()
นี้คือฟังก์ชันช่วยเหลือที่คืนค่าอาเรย์โดยมีข้อมูลต่างๆของไฟล์ที่ถูกอัพโหลดสมบูรณ์แล้ว และนี้คือตัวอย่างอาเรย์
Array
(
[file_name] => mypic.jpg
[file_type] => image/jpeg
[file_path] => /path/to/your/upload/
[full_path] => /path/to/your/upload/jpg.jpg
[raw_name] => mypic
[orig_name] => mypic.jpg
[file_ext] => .jpg
[file_size] => 22.2
[is_image] => 1
[image_width] => 800
[image_height] => 600
[image_type] => jpeg
[image_size_str] => width="800" height="200"
)
คำอธิบาย
นี้คือคำธิบายอาเรย์ด้านบนทั้งหมด
| Item | Description |
|---|---|
| file_name | ชื่อไฟล์ที่ไฟล์นั้นถูกอัพโหลดโดยมีประเภทของไฟล์นั้นรวมอยู่ด้วย |
| file_type | ประเภท mime ของไฟล์ |
| file_path | ตำแหน่งไฟล์แท้จริงของเซิร์ฟเวอร์ (ไม่มีชื่อไฟล์) |
| full_path | ตำแหน่งไฟล์แท้จริงของเซิร์ฟเวอร์ร่วมทั้งชื่อไฟล์ |
| raw_name | ชื่อไฟล์โดยไม่รวมประเภทของไฟล์ |
| orig_name | ไฟล์ชื่อเดิม สิ่งนี้จะเป็นประโยชน์ถ้าคุณใช้ทางเลือกการเข้ารหัสชื่อ |
| file_ext | ประเภทไฟล์พร้อมกับจุด |
| file_size | ขนาดไฟล์ในหน่วย kilobyte |
| is_image | เป็นไฟล์รูปหรือไม่ 1 = ไฟล์รูป 0 = ไม่ใช่ไฟล์รูป |
| image_width | ความกว้างของรูป |
| image_heigth | ความสูงของรูป |
| image_type | ประเภทของรูปโดยเป็นประเภทไฟลโดยไม่มีจุด |
| image_size_str | สตริงที่มีทั้งความกว้างและความสูง เหมาะสำหรับจะนำไปใส่ในแท็ก image (ตัวอย่างสตริงคือ "width=100 height=100") |