01/10/2018, 15:30

Bài 16: PHP –  Upload File

PHP có thể sử dụng form HTML để upload file tới server. Khởi đầu các file được upload vào một thư mục tạm thời và sau đó được chuyển tới một địa chỉ đích bằng PHP. Mở tập tin php.ini ra và tìm đến dòng upload_tmp_dir, đây là nơi định nghĩa đường dẩn lưu tạm khi upload file, và một ...

 

PHP có thể sử dụng form HTML để upload file tới server. Khởi đầu các file được upload vào một thư mục tạm thời và sau đó được chuyển tới một địa chỉ đích bằng PHP.

Mở tập tin php.ini ra và tìm đến dòng upload_tmp_dir, đây là nơi định nghĩa đường dẩn lưu tạm khi upload file, và một dòng quy định kích thước tối đa cho file upload, đó là upload_max_filesize. Các bạn có thể tùy chỉnh lại đường dẩn và kích thước theo ý mình.

Quá trình upload một file sẽ diễn ra theo các bước sau:

  • User mở trang chứa đựng một form HTML gồm có một tập tin văn bản, một nút browse và một nút submit.
  • User click vào nút browse và chọn một file để upload từ máy tính cuar user.
  • Một đường dẩn đầy đủ chứa file đã chọn xuất hiện, sau đó user click nút submit.
  • File đã chọn được gửi tới thư mục tạm trên server.
  • Script PHP xác định và kiễm tra rằng file đã đến và sau đó copy file vào một thư mục chỉ định.
  • Script PHP xác nhận thành công tới user.

Như thường khi ghi các file lên hệ thống thì phải set quyền được ghi cho cả 2 thư mục tạm và thư mục đích cần chứa file. Nếu chỉ set là read-only thì quá trình sẽ thất bại.

Một file được upload có thể là text file hoặc hình ảnh hoặc một file tài liệu.

Tạo Một Form Upload

Chúng ta sẽ tạo một HTML là form upload. Form này có thuộc tính method là post và thuộc tính enctype là multipart/form-data

<html>

   <body>

      <form action=”” method=”POST” enctype=”multipart/form-data”>

         <input type=”file” name=”image” />

         <input type=”submit”/>

      </form>

   </body>

</html>

Các bạn lưu ý thuộc tính action trong form, nếu để rỗng thì mặc định khi form submit sẽ lấy đường dẩn của file hiện hành, còn nếu bạn đưa vào một đường dẩn khác, nơi sẽ xử lý form sau khi submit thì đưa vào thuộc tính action. Trong ví dụ này chúng ta sẽ thực hiện xử lý form sau submit cùng file,cùng đường dẩn hiện hành.

Lưu form HTML với tên file bạn yêu thích và bỏ vào thư mục htdocs của XAMPP và tiến hành chạy ngoài trình duyệt bạn sẽ thấy form như hình sau:

bai16_upload_file

Tạo Một Script Upload

Có một biến global mà PHP cung cấp để xử lý file đó là $_FILES. Biến này là một mảng 2 chiều và giữ tất cả thông tin liên quan tới file upload.

Vì thế nếu giá trị được đưa vào thuộc tính tên input trong form upload là file, nói khó hiểu nhỉ, tức là với html là thẻ input và có type là file như trong form upload ở trên. Thì PHP sẽ tạo ra năm giá trị của file như sau:

  • $_FILES[‘file’][‘tmp_name’]– file được upload vào thư mục tạm trên server.
  • $_FILES[‘file’][‘name’]– Tên thực sự của file upload.
  • $_FILES[‘file’][‘size’]– Kích thước của file, đo bằng byte.
  • $_FILES[‘file’][‘type’]− MIME type của file upload.
  • $_FILES[‘file’][‘error’]– mã lổi liên quan đến file upload.

Rồi bây giờ mở lại file tạo form upload, đưa thêm script PHP để xử lý upload. Bạn có thể để đầu file hoặc cuối file script này.

<?php

   if(isset($_FILES[‘image’])){

      $errors= array(); //xử lý nếu có lổi xãy ra và thông báo đến người dùng

      $file_name = $_FILES[‘image’][‘name’];

      $file_size = $_FILES[‘image’][‘size’];

      $file_tmp = $_FILES[‘image’][‘tmp_name’];

      $file_type = $_FILES[‘image’][‘type’];

      $file_ext=strtolower(end(explode(‘.’,$_FILES[‘image’][‘name’])));

      $expensions= array(“jpeg”,”jpg”,”png”);

      if(in_array($file_ext,$expensions)=== false){

         $errors[]=”extension not allowed, please choose a JPEG or PNG file.”;

      }

      if($file_size > 2097152) {

         $errors[]=’File size must be excately 2 MB’;

      }

      if(empty($errors)==true) {

         move_uploaded_file($file_tmp,”images/”.$file_name);

         echo “Success”;

      }else{

         print_r($errors);

      }

   }

?>

<html>

   <body>

      <form action = “” method = “POST” enctype = “multipart/form-data”>

         <input type = “file” name = “image” />

         <input type = “submit”/>

         <ul>

            <li>Sent file: <?php echo $_FILES[‘image’][‘name’];  ?>

            <li>File size: <?php echo $_FILES[‘image’][‘size’];  ?>

            <li>File type: <?php echo $_FILES[‘image’][‘type’] ?>

         </ul>

      </form>

   </body>

</html>

Diễn giải mã script PHP:

Mặc định khi chạy file này lên lần đầu load form upload thì script PHP sẽ không thực hiện được bởi vì chúng ta đã đưa vào điều kiện isset cho input có name là image “   if(isset($_FILES[‘image’]))” , nếu nó có set dữ liệu thì mới chạy các lệnh bên trong if. Mà các yếu tố, nhân tố trong form chỉ được set dữ liệu khi đã nhấn submit.

Rồi, sau khi chúng ta upload file từ form và nhấn nút submit thì lúc bấy giờ script PHP sẽ thỏa mãn điều kiện   if(isset($_FILES[‘image’])) và các câu lệnh bên trong if sẽ làm việc, tiến hành upload file.

Như đã đề cập ta dùng biến $_FILES để lấy các giá trị liên quan đến file upload và tính toán các điều kiện hợp lý cho upload hay ko, hoặc file lổi.

Như ví dụ ta muốn file có phần mở rộng là file ảnh.

Đây là phần code kiễm tra phần mở rộng hợp lý của file

$file_ext=strtolower(end(explode(‘.’,$_FILES[‘image’][‘name’])));

      $expensions= array(“jpeg”,”jpg”,”png”);

      if(in_array($file_ext,$expensions)=== false){

         $errors[]=”extension not allowed, please choose a JPEG or PNG file.”;

      }

Các bạn có thể var_dump biến $_FILES[‘image’][‘name’] để xem giá trị, hoặc muốn xem bất kỳ giá trị nào khác để hiểu rõ về đoạn script.

Các bước kiễm tra đã xong và nếu hợp lệ thì một việc đơn giản sau cùng là chúng ta di chuyển file vào nơi chúng ta muốn upload lên server

move_uploaded_file($file_tmp,”images/”.$file_name);

Chúng ta sử dụng hàm move_uploaded_file để di chuyển file vào thư mục mong muốn từ thư mục tạm.

Bài tập cho phần này:

Hãy thực hiện upload các file khác như file word, file văn bản txt, file pdf  với kích thước khác nhau v.v

0