PHP file upload - xây dựng code upload file hướng đối tượng

Thảo luận trong 'PHP & MySQL' bắt đầu bởi Lê Xuân Thành, 15/12/11.

  1. Lê Xuân Thành

    Lê Xuân Thành Staff Member

    Trước khi xem bài này bạn có thể nên xem lại bài: http://joomlaviet.info/forum/php-my...-xay-dung-code-upload-file-huong-thu-tuc.html

    Công việc của bài này là: tối ưu hóa code trên và xây dựng theo kiểu hướng đối tượng

    Bắt đầu nào..............

    Phần 1: tối ưu hóa code upload
    mục đích là ta có thể sử dụng code 1 cách nhanh chóng không cồng kềnh bằng việc viết hàm có sẳn và dùng lại nhiều lần.
    Vậy ta cần viết những hàm gì?
    thứ nhất: cần phải xem chúng ta upload những gì lên server -> hàm kiểm tra phần mở rộng
    HTML:
    function check_file_extent($file_name, $file_extent){
        $pattern='#.+\.(gif|jpg|png)$#i';
        if(preg_match($pattern,$file_name)==1){
        $file_type=true;
        }else{
        $file_type=false;
        }
    }
    
    thứ hai: thực hiện upload lên server -> hàm upload
    HTML:
    function upload($file_name,$upload_path){
        $source=$_FILES['upload']['tmp_name'];
        $dest='images/'.$_FILES['upload']['name'];
        if(@copy($source,$dest)==true){
        $flag=true;
        }else{
        $flag=false;
        }
        return $flag;
    }
    Để gọn ta cho 2 hàm này vào 1 file function.php

    Khi đó file xuly.php của chúng ta cần chỉnh lại là:
    HTML:
    <?php
    
        require_once('functions.php');
       $file_name = $_FILES['upload']['name'];
        $file_type = check_extent_file($file_name, 'gif|jpg|png');
        $flag = false;
        if ($file_type == true) {
            $flag = upload_file('upload', '../images');
        }
        if ($flag == true) {
            echo '<br> Upload thành công';
        } else {
            echo '<br> Upload thất bại';
        }
    ?>
    Phần 2: Hướng đối tượng cho code
    Trước khi bắt đầu chúng ta phải xác định trước những chức năng cần thiết để xử lý vấn đề. Sau đó xây dựng lớp chứa các phương thức với các chức năng đã xác định.
    Bước 1. Xác định yêu cầu
    • Upload một tập tin bất kỳ
    • Thư mục chứa tập tin sẽ upload
    • Kiểm tra phần mở rộng của tập tin
    • Kiểm tra kích thước tập tin upload
    • Thay đổi tên tập tin upload
    Bước 2. Xác định thuộc tính:
    • Tên của tập tin ($_fileName)
    • Kích thước tối đa được phép upload ($_fileSize)
    • Phần mở rộng của các tập tin được phép upload ($_fileExtension)
    • Tập tin tạm trước khi upload lên server ($_fileTmp)
    • Thư mục chứa tập tin upload ($_uploadDir)
    Bước 3. Xác định và xây dựng các phương thức
    Nhận tập tin upload
    Kiểm tra điều kiện upload
    Kích thước của tập tin
    Kiểu mở rộng của tập tin
    Upload tập tin: giữ nguyên tên của tập tin gốc và thay đổi tập tin gốc
    Như vậy ta sẽ cần những phương thức sau:
    • Phương thức khởi tạo ( __construct() )
    • Phương thức thiết lập kích thước tập tin upload (setFileSize() )
    • Phương thức thiết lập phần mở rộng của tập tin upload (setFileExtension() )
    • Phương thức thiết lập thư mục upload tập tin (setUploadDir() )
    • Phương thức kiểm tra tất cả các điều kiện của tập tin upload ( isVail() )
    • Phương thức upload tập tin ( upload() )
    Ta tạo 1 file upload.class.php với nội dung như sau:
    HTML:
    <?php 
    class Upload{ 
        // Bien luu tru ten tap tin upload 
        var $_fileName; 
        
        //Bien luu tru kich thuoc cua tap tin upload 
        var $_fileSize; 
         
        //Bien luu tru phan mo rong cua tap tin upload 
        var $_fileExtension; 
         
        //Bien luu tru duong dan cua thu muc tam tap tin upload 
        var $_fileTmp; 
         
        //Bien luu tru duong tren server cua tap tin upload 
        var $_uploadDir; 
         
        //Bien luu tru error  
        var $_errors; 
         
        //Ham khoi tao doi tuong 
        function __construct($file_name){ 
          
            $fileInfo =  $_FILES[$file_name]; 
            $this->_fileName = $fileInfo['name']; 
            $this->_fileSize = $fileInfo['size']; 
            $this->_fileExtension = $this->getFileExtension(); 
            $this->_fileTmp = $fileInfo['tmp_name']; 
             
        } 
         
        //Ham lay thanh phan mo rong cua tap tin upload 
        function getFileExtension(){ 
            $subject = $this->_fileName;     
            $pattern = '#\.([^\.]+)$#i';     
            preg_match($pattern,$subject,$matches); 
            return $matches[1]; 
        } 
         
        //Ham thiet lap thanh phan mo rong tap tin upload 
        function setFileExtension($value){ 
            $subject = $this->_fileExtension;     
            $pattern = '#(' . $value . ')#i';     
            if(preg_match($pattern,$subject,$matches)!= 1){ 
                $this->_errors[] = 'Phan mo rong khong phu hop'; 
            } 
        } 
         
        //Ham thiet lap kich thuoc tap tin upload 
        function setFileSize($value){ 
            $size = $value * 1024; 
            if($this->_fileSize > $size){ 
                $this->_errors[] = 'Kich thuoc tap tin lon hon ' . $size . 'kb'; 
            }     
        } 
         
        //Ham thiet lap kich thuoc tap tin upload 
        function setUploadDir($value){ 
            if(file_exists($value)){ 
                $this->_uploadDir = $value; 
            }else{ 
                $this->_errors[] = 'Thu muc khong he ton tai'; 
            } 
        } 
         
        //Ham kiem tra dieu kien upload 
        function isVail(){ 
            $flagErr = false; 
            if(count($this->_errors)>0){ 
                $flagErr =  true; 
            } 
             
            return $flagErr; 
        } 
         
        //Ham upload tap tin 
        function upload($rename =  false, $prefix = 'file_'){ 
            if($rename ==  false){ 
                $source = $this->_fileTmp; 
                $dect = $this->_uploadDir . $this->_fileName; 
            }else{ 
                $source = $this->_fileTmp; 
                $dect = $this->_uploadDir . $prefix . time() . '.' . $this->_fileExtension; 
            } 
            copy($source,$dect); 
        } 
    }
    ?>
    Và file xuly.php của ta sẽ là:
    HTML:
    <?php 
      
     include 'upload.class.php'; 
      
     $upload  = new Upload('picture'); 
     $upload->setUploadDir('images/'); 
     if($upload->isVail() == true){ 
         echo "<pre>"; 
         print_r($upload->_errors); 
         echo "</pre>"; 
     }else{ 
         $upload->upload(true,'pic_'); 
     }
    ?>
  2. Yachi_Emiko

    Yachi_Emiko Active Member

    Huynh à, cho đệ hỏi cái chữ "@" để trước copy nó có ý nghĩa gì zậy ?:confused:
  3. Lê Xuân Thành

    Lê Xuân Thành Staff Member

    Chữ @ để trước có ý nghĩa là: khi có lổi thì sẽ ko hiện lổi ra ngoài.
    Yachi_Emikocntt thích bài này.
  4. Yachi_Emiko

    Yachi_Emiko Active Member

    :) oh, 10 ky tu

Chia sẻ trang này