Project นี้หยุดพัฒนาแล้ว.
โปรดตัดสินใจใช้ PHP upload class version 2 แทน.
vfileup คือ PHP upload class มีไว้สำหรับงาน upload ใช้แทนการ upload แบบเดิมๆที่เคยทำกัน
ดาวน์โหลดLicense
นำไปใช้งานได้อย่างอิสระ ทั้งเชิงพาณิชย์และไม่ใช่เชิงพาณิชย์
การแก้ไข ปรับแต่ง แจกจ่าย ทำซ้ำ สามารถทำได้อย่างอิสระ โดยต้องคงข้อมูล @author @copyright ต่างๆในไฟล์ vfileup.php และ mime-upload.php ที่มีอยู่เดิมเอาไว้
ตารางอ้างอิง property
property | คำอธิบาย | ตัวอย่าง |
---|---|---|
allowed_types | กำหนดประเภทไฟล์ที่อนุญาตให้อัพโหลด | $vfileup->allowed_types = "jpg|gif|png"; |
encrypt_name | กำหนดว่าเข้ารหัสชื่อไฟล์หรือไม่ ค่าเป็น true/false ค่าเดิมคือ false | $vfileup->encrypt_name = false; |
error_msg | เมื่อมี error ใดๆจะส่งผ่านมาทางค่านี้ ใช้สำหรับแสดงหรือตรวจสอบ error; ทั้งนี้หากไม่มี error ค่าตรงนี้จะว่างเปล่า | echo $vfileup->error_msg; |
filename | ตั้งชื่อไฟล์ โดยไม่ต้องมีสกุลไฟล์ (.ext) | $vfileup->filename = "new-file-name"; |
max_size | กำหนดขนาดไฟล์ที่จะอัพโหลดโดยขนาดเป็นไบต์ (สามารถหาค่าจาก KB, MB เป็นไบต์ได้จาก google โดยพิมพ์ 2MB to byte) | $vfileup->max_size = "1024"; |
overwrite | กำหนดว่าจะอัพโหลดทับไฟล์เดิมหรือไม่ ค่าเป็น true/false ค่าเดิมคือ false โดยหากเป็น false จะไม่ทับไฟล์ที่มีอยู่แล้ว และจะเติม (จำนวน) ต่อท้ายไฟล์เข้าไปแทน | $vfileup->overwrite = false; |
remove_space | กำหนดว่าจะลบช่องว่างในชื่อไฟล์หรือไม่ ค่าเป็น true/false ค่าเดิมคือ true หากกำหนดเป็น true จะลบช่องว่างและเปลี่ยนเป็นเครื่องหมาย - | $vfileup->remove_space = true; |
upload_path | กำหนด path สำหรับ upload ไฟล์โดยไม่ต้องมี / ปิดท้าย ทั้งนี้อาจกำหนดเป็น path แบบเต็มก็ได้ | ตัวอย่าง 1 $vfileup->upload_path = dirname(__FILE__)."/upload"; ตัวอย่าง 2 $vfileup->upload_path = "/path/from/root/to/wwwhome/public_html/upload"; |
ตารางอ้างอิง method
Method | คำอธิบาย | ตัวอย่าง |
---|---|---|
do_upload | สั่งให้ทำการ upload หรือ move_uploaded_file นั่นเอง. โดยจะคืนค่า true เมื่อทำสำเร็จผ่านตามเงื่อนไขที่กำหนด และ false เมื่อติดขัดไม่ผ่านเงื่อนไข และจะส่งค่า error_message ไปทาง property เมื่อมีการคืนค่า false | $vfileup->do_upload(); |
data | เมื่ออัพโหลดสำเร็จ การเรียก data จะทำการส่งค่าต่างๆเกี่ยวกับไฟล์ที่อัพโหลดออกมาเป็น array | $vfileup->data(); |
ข้อมูลที่ส่งมาจาก method data()
array(
[file_name] => aafd796c7771460b6b49ad5746942a77398a5a72.jpg
[file_name_only] => aafd796c7771460b6b49ad5746942a77398a5a72
[file_type] => image/jpeg
[file_path] => /path/to/image/upload/aafd796c7771460b6b49ad5746942a77398a5a72.jpg
[full_path] => /path/to/image/upload
[orig_name] => tripod.jpg
[client_name] => tripod.jpg
[file_ext] => jpg
[file_size] => 284416
)
ค่าใน array | คำอธิบาย |
---|---|
file_name | ชื่อไฟล์ที่อัพโหลดสำเร็จแล้ว รวมสกุลไฟล์ด้วย (.ext) |
file_name_only | ชื่อไฟล์ที่อัพโหลดสำเร็จแล้ว โดยมีแค่ชื่อไฟล์ล้วนๆ |
file_type | ประเภทไฟล์ (mime type) ของไฟล์ที่อัพโหลดมา |
file_path | path เต็มของตำแหน่งเก็บไฟล์ไปจนถึงชื่อไฟล์ที่อัพโหลดแล้ว |
full_path | path เต็มของตำแหน่งเก็บไฟล์ โดยไม่มีชื่อไฟล์ |
orig_name | ชื่อไฟล์ที่อัพโหลดสำเร็จ ก่อนทำการ encrypt ชื่อ(ถ้ากำหนด encrypt_name = true) |
client_name | ชื่อไฟล์ที่ผู้ใช้อัพโหลดมา |
file_ext | นามสกุลไฟล์ |
file_size | ขนาดไฟล์ |
ตัวอย่างการใช้งาน
จากนี้จะขออธิบายแบบง่ายๆทีละขั้นตอนนะครับ
ก่อนอื่นให้สร้าง form สำหรับอัพโหลดเสียก่อน
<div style="border: 1px solid #eee; margin: 150px auto 0 auto; overflow: hidden; padding: 10px; width: 500px;">
<h1 style="font-size: 20px;">vfileup : PHP vee's file upload class.</h1>
<?php if ( isset($form_status) ) {echo $form_status;} ?>
<form method="post" action="sample.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" /><!--2097152 byte = 2MB -->
file: <input type="file" name="file" value="" /><br />
<button type="submit" name="btn">Upload</button>
</form>
<span style="color:#aaa; font-size: 11px;">© <a href="https://rundiz.com" style="color:#aaa;">rundiz.com</a></span>
</div>
จากนั้นในไฟล์ของ action ไฟล์ sample.php ทำการตรวจก่อนเลยว่ามีการอัพโหลดหรือยัง หากยังไม่มีจะได้ไม่ต้องเสียเวลาสั่งทำงานให้เปลืองทรัพยากร 🙂
if ( isset($_FILES['file']['name']) && $_FILES['file']['name'] != null ) {
...
}
ข้างใน if ด้านบน ก็ทำการ include vfileup.php เข้ามา
if ( isset($_FILES['file']['name']) && $_FILES['file']['name'] != null ) {
include(dirname(__FILE__)."/vfileup.php");
}
จากนั้นก็เริ่มเรียก new vfileup โดยใส่ค่า $_FILES['file'] ลงไปในนั้น แล้วทำการกำหนด config ต่างๆลงไป
if ( isset($_FILES['file']['name']) && $_FILES['file']['name'] != null ) {
include(dirname(__FILE__)."/vfileup.php");
$vfileup = new vfileup($_FILES['file']);
// config upload
$vfileup->allowed_types = "jpg|gif|png|txt";
$vfileup->encrypt_name = true;
$vfileup->filename = '';// กำหนดชื่อเฉยๆ ไม่ต้องมี .ext
$vfileup->max_size = "";// size in byte
$vfileup->overwrite = false;
$vfileup->remove_space = true;
$vfileup->upload_path = dirname(__FILE__);
}
ทำการเรียก do_upload() ได้เลย แล้วเช็คด้วยว่ามันส่งค่า false หรือ true กลับมา
ถ้าส่งค่า false กลับมาคือล้มเหลวในการอัพโหลด ถ้าส่งค่า true กลับมาคืออัพโหลดสำเร็จแล้วครับ
if ( isset($_FILES['file']['name']) && $_FILES['file']['name'] != null ) {
include(dirname(__FILE__)."/vfileup.php");
$vfileup = new vfileup($_FILES['file']);
// config upload
$vfileup->allowed_types = "jpg|gif|png|txt";
$vfileup->encrypt_name = true;
$vfileup->filename = '';// กำหนดชื่อเฉยๆ ไม่ต้องมี .ext
$vfileup->max_size = "";// size in byte
$vfileup->overwrite = false;
$vfileup->remove_space = true;
$vfileup->upload_path = dirname(__FILE__);
// upload
$upload_result = $vfileup->do_upload();
if ( $upload_result !== true ) {
$form_status = "<div class=\"block-error\">" . $vfileup->error_msg . "</div>";
} else {
$form_status = "<div class=\"block-success\">success</div>";
}
}
จากโค้ดข้างบน $form_status คือตัวแปรที่ข้อความ error, success ส่งออกมา ให้ทำการ echo มันทีหลังด้วยนะครับ
การนำเอาค่าชื่อไฟล์ที่อัพโหลดสำเร็จแล้วไปใช้ ให้เรียก data() แล้วอ้างอิงค่า array ตามตารางด้านบน
แต่การเรียก data() ควรทำเมื่อ do_upload() ส่งค่า true กลับมาเท่านั้น
if ( isset($_FILES['file']['name']) && $_FILES['file']['name'] != null ) {
include(dirname(__FILE__)."/vfileup.php");
$vfileup = new vfileup($_FILES['file']);
// config upload
$vfileup->allowed_types = "jpg|gif|png|txt";
$vfileup->encrypt_name = true;
$vfileup->filename = '';// กำหนดชื่อเฉยๆ ไม่ต้องมี .ext
$vfileup->max_size = "";// size in byte
$vfileup->overwrite = false;
$vfileup->remove_space = true;
$vfileup->upload_path = dirname(__FILE__);
// upload
$upload_result = $vfileup->do_upload();
if ( $upload_result !== true ) {
$form_status = "<div class=\"block-error\">" . $vfileup->error_msg . "</div>";
} else {
$form_status = "<div class=\"block-success\">success</div>";
$data = $vfileup->data();
echo "ชื่อไฟล์ที่อัพโหลดสำเร็จแล้วคือ " . $data['file_name'] . " มีขนาด " . $data['file_size'] . " bytes, ประเภทไฟล์ " . $data['file_type'];
}
}
ตัวอย่างเพิ่มเติม
หากต้องการอัพโหลดไว้ใน directory อื่นๆแล้วเก็บ directory/file.ext นั้นไว้ในฐานข้อมูลล่ะทำยังไง?
ง่ายนิดเดียวครับ ลองดูตัวอย่างต่อไปนี้แล้วเทียบกับตัวอย่างข้างบนนี่เอาเองนะครับ
if ( isset($_FILES['file']['name']) && $_FILES['file']['name'] != null ) {
$upload_path = "images/upload";// กำหนดตำแหน่ง upload ตรงนี้
include(dirname(__FILE__)."/vfileup.php");
$vfileup = new vfileup($_FILES['file']);
// config upload
$vfileup->allowed_types = "jpg|gif|png|txt";
$vfileup->encrypt_name = true;
$vfileup->filename = '';// กำหนดชื่อเฉยๆ ไม่ต้องมี .ext
$vfileup->max_size = "";// size in byte
$vfileup->overwrite = false;
$vfileup->remove_space = true;
$vfileup->upload_path = $upload_path;// เอาตำแหน่ง upload มาใส่ตรงนี้
// upload
$upload_result = $vfileup->do_upload();
if ( $upload_result !== true ) {
$form_status = "<div class=\"block-error\">" . $vfileup->error_msg . "</div>";
} else {
$form_status = "<div class=\"block-success\">success</div>";
$data = $vfileup->data();
echo "ชื่อไฟล์ที่อัพโหลดสำเร็จแล้วคือ " . $data['file_name'] . " มีขนาด " . $data['file_size'] . " bytes, ประเภทไฟล์ " . $data['file_type'] . "<br />";
//ทำการเรียกคำสั่ง sql
$sql = "insert into table (file_upload, file_size, file_type) VALUES ('".$upload_path."/".$data['file_name']."', ".$data['file_size'].", '".$data['file_type']."')";
mysql_query($sql);
echo "อัพโหลดเข้าฐานข้อมูลเรียบร้อยแล้ว";
}
}
faq
จะทำอย่างไรถ้ามี error "ประเภทไฟล์ที่คุณกำลังอัพโหลดนั้น ไม่มีระบุอยู่ใน mime type ที่กำหนดไว้"
error นี้หมายความว่าประเภทไฟล์ที่กำลังอัพโหลดนั้น ไม่มีอยู่ในรายการ mime-upload.php
ให้ทำการ detect หา mime type ของไฟล์ที่อัพโหลดแล้วมีปัญหา แล้วทำการเพิ่มเข้าไปใน mime-upload.php
โดยให้อ่านรายละเอียดการเพิ่มในไฟล์นั้นอย่างละเอียดและเคร่งครัด เพื่อป้องกันปัญหาที่จะเกิดขึ้นครับ
การเช็ค mime type โดยใช้ค่า [type] ที่ส่งมาจากการอัพโหลดนั้นไม่ปลอดภัยเพียงพอ
ใช่ครับ การเช็คแค่นั้นไม่ปลอดภัยพอ แต่ว่า php ไม่มี function ใดๆเลยที่สามารถอ่าน mime จากไฟล์จริงๆได้ โดยไม่ต้องพึ่ง pecl หรือออพชั่นเสริมอื่นๆ
ทั้งนี้มันก็มี fileinfo()
ให้ใช้ได้อยู่ แต่ว่ามันต้องการ php 5.3+
หากมีใครเอาไป modify เพิ่มเติมได้ และอยากจะเผยแพร่ ขอเชิญแปะลิ้งค์หน้าดาวน์โหลดไว้ที่ comment ด้านล่างนี้ได้เลยครับ.