vfileup PHP upload class

vfileup คือ PHP upload class มีไว้สำหรับงาน upload ใช้แทนการ upload แบบเดิมๆที่เคยทำกัน

vfileup php upload class

ดาวน์โหลด

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;">&copy; <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 ด้านล่างนี้ได้เลยครับ.