Tải file từ máy khách lên máy chủ

Một phần của tài liệu Lập trình web động với PHP và MySql cơ bản và nâng cao của học viện NIIT (Trang 65 - 68)

VII. File và upload file Xử lý email

2.Tải file từ máy khách lên máy chủ

Trong quá trình trao đổi dữ liệu giữa máy khách và máy chủ, tải file là một công việc rất thường gặp. Đó có thể là việc tải một file hình ảnh lên máy chủ, 1 file zip hay 1 file tài liệu bất kỳ nào đó. Sau khi đưa lên máy chủ, các file này sẽ được cung cấp liên kết để người dùng có thể tải file về sử dụng.

Cách tải file thông dụng nhất hiện nay là sử dụng giao thức FTP. Tuy nhiên, tài khoản ftp thường ít được chia sẻ vì nó liên quan rất nhiều đến hệ thống, và thường chỉ có các admin mới có được tài khoản này. Vì vậy, các trang web động thường sử dụng một cách khác để truyền tải file lên dựa vào chuần giao thức HTTP (sử dụng HTML Form).

a. Xây dựng form HTML để cho phép người dùng lựa chọn file cần tải

Quay trở lại một form trong HTML, chúng ta đã biết các thành phần căn bản của form như: tên form, các phần tử nhập dữ liệu như textarea, thẻ input, thẻ lựa chọn select - option... Để có thể cho phép người dùng lựa chọn một file nào đó trên máy tính và tải lên, form HTML này sẽ có một cấu trúc hơi đặc biệt một chút, và có một thành phần là thẻ input với type="file".

Trước tiên, chúng ta quay trở lại với thẻ <form>

Như ở trên, chúng ta đã biết thẻ form có một số thuộc tính:

- method: Xác định kiểu truyền dữ liệu là GET hay POST. Để tải file, method bắt buộc phải có kiểu POST (vì dữ liệu trong file thường là lớn hơn những gì mà GET có thể truyền tải).

- action: Xác định địa chỉ URL mà dữ liêu cần gửi tới

Để tải file, ta cần phải biết thêm một thuộc tính nữa, đó là thuộc tính enctype với giá trị là multipart/form-data.

Như vậy, để thiết kế một form cho phép tải file, ta phải làm như sau: <form enctype="multipart/form-data" action="địa_chỉ_web" method="post"> Các thành phần trong form như văn bản, hình ảnh, ô nhập liệu...

</form>

Tiếp đó, chúng ta sẽ trang bị một ô để cho phép người dùng lựa chọn file cần tải lên. Thành phần này cũng vẫn là thẻ input nhưng với type="file":

<input name="ten_phan_tu" type="file">

Khi đưa thẻ này vào, nó sẽ hiển thị một ô và nút Browse bên cạnh. Người dùng sẽ kích chuột vào nút Browse để lựa chọn file như chúng ta thường thấy.

Dưới đây là một form đơn giản chỉ chứa một ô để tải file và nút submit:

<form enctype="multipart/form-data" method="post">

Lựa chọn file cần tải: <input name="UserFileName" type="file"> <input type="submit" value="Submit">

</form>

b. Xử lý file trên máy chủ

Ở mục a, ta đã xây dựng được một form để cho phép người dùng chọn file. Sau khi người dùng bấm nút Submit, file sẽ được tải lên máy chủ, và được máy chủ lưu vào một thư mục tạm, đồng thời sinh ra một mảng có tên là $_FILES["tên_phần_tử_trên_form"] hoặc có một tên khác là $HTTP_POST_FILES["tên_phần_tử_trên_form"]. Việc tiếp theo, chúng ta cần kết hợp một số hàm xử lý tệp và thư mục để điều khiển file đó.

Trước tiên, chúng ta thử tìm hiểu xem cái mảng kia chứa những thông tin gì:

Với ví dụ trên, tên_phần_tử_trên_form là UserFileName (tương ứng với thẻ <input name="UserFileName" type="file">)

Như vậy khi người dùng chọn file rồi kích chọn Submit thì trình duyệt sẽ gửi file lên. Sau khi hoàn tất việc gửi file, máy chủ sẽ sinh ra một mảng có tên là $_FILES["UserFileName"]. Mảng này chứa các thông tin sau:

• $_FILES['UserFileName']['name']: Tên gốc của file trên máy khách

• $_FILES['UserFileName']['type']: Kiểu MIME của file (nếu trình duyệt cung cấp thông tin). Ví dụ: "image/gif".

• $_FILES['UserFileName']['size']: Kích thước của file được tải tính theo byte • $_FILES['UserFileName']['tmp_name']: Tên tạm của file khi nó đã được tải và

lưu trên thư mục tạm của máy chủ.

Như vậy chúng ta đã có được đầy đủ các thông tin để xử lý file. File này có thể được mở ra để lấy dữ liệu, có thể được copy vào một thư mục nào đó, hoặc bị xoá bỏ, hay đổi tên... Dưới đây là một ví dụ thực hiện việc tải file:

// Đoạn mã HTML để tạo form

<form enctype="multipart/form-data" action="_URL_" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> Send this file: <input name="userfile" type="file" />

<input type="submit" value="Send File" /> </form> (adsbygoogle = window.adsbygoogle || []).push({});

// Đoạn chương trình xử lý file đã upload: $uploaddir = '/var/www/uploads/';

$uploadfile = $uploaddir . $_FILES['userfile']['name']; print "<pre>";

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File hợp lệ, và đã được tải lên thành công. ";

echo "Dưới đây là một số thông tin của file:\n"; print_r($_FILES);

} else {

echo "Lỗi tài file! Dưới đây là một số thông tin:\n"; print_r($_FILES);

}

print "</pre>";

Ví dụ trên chỉ minh họa cách thức tải file lên máy chủ. Trong thực tế, chúng ta sẽ phải đương đầu với một số thử thách:

- Kích thước của file bị thiết lập giới hạn trong file php.ini. Nếu file tải lên vượt quá giới hạn này sẽ gây lỗi tải file. Thông thường thì các máy chủ chỉ cho phép tải các file với kích thước nhỏ hơn 2 MB.

- Bạn sẽ phải kiểm soát chặt chẽ file tải lên. Nếu như bạn không kiểm soát chặt, người dùng có thể tải lên các file thực thi (*.php) và qua đó, có thể tải lên các công cụ viễn thám hay tệ hại hơn là phá hủy toàn bộ website của bạn.

Đoạn mã dưới đây minh họa cách thức cho phép hay không cho phép tải các loại file lên máy chủ:

// Xác định phần đuôi mở rộng của file được tải lên, thường là 3 ký tự cuối cùng. $UserFileType= strtolower(substr($_FILES['UserFileName']['name'], -3));

//Chuỗi xác định danh sách các loại file được phép tải lên máy chủ: $AllowFileType=”bmp,zip,rar,jpg,gif”;

//Kiểm tra xem loại file đó có được phép tải lên hay không? Nếu có thì copy sang thư mục lưu: If (strpos($UserFileType,$AllowFileType)!=FALSE)

{

$uploaddir = '/var/www/uploads/';

$uploadfile = $uploaddir . $_FILES['userfile']['name']; print "<pre>";

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File hợp lệ, và đã được tải lên thành công. ";

echo "Dưới đây là một số thông tin của file:\n"; print_r($_FILES);

} else {

echo "Lỗi tài file! Dưới đây là một số thông tin:\n"; print_r($_FILES); } print "</pre>"; } else {

echo “Lỗi xảy ra! File của bạn không được phép tải lên!”; }

Một điểm nữa cần phải lưu ý, đó là khi tiến hành các thao tác copy file đã tải lên, chúng ta cần phải kiểm tra xem thư mục đó có được phép ghi hay không? Nếu như bạn không được phép ghi vào thư mục đó, quá trình tải file sẽ gây lỗi. Ngoài ra, chúng ta cũng cần chú ý kiểm tra sự tồn tại của file trước khi tiến hành copy. Nếu như tên file đã tồn tại, theo mặc định, bạn sẽ không được phép ghi đè lên file đã tồn tại. Nếu cần, hãy sử dụng hàm unlink() để xóa file trước khi tiến hành sao chép file.

Một phần của tài liệu Lập trình web động với PHP và MySql cơ bản và nâng cao của học viện NIIT (Trang 65 - 68)