Sunday, 12 June 2011
Xử lý thư mục và tệp tin (Phần II)
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).
I. 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).
- name: Xác định tên của form (tên này có thể được dùng để truyền dữ liệu qua javascript)
- 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, để tải file, ta phải làm một form 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>
II. Xử lý file trên máy chủ
Như vậy 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 là ta phải xử lý cái file đó như thế nào?
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... Xin xem thêm phần I và phần II ở trên để biết các thao tác điều khiển tệp và thư mục.
Dưới đây là một ví dụ lấy từ PHP Manual:
// Đ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>
// Đ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)) {
print "File is valid, and was successfully uploaded. ";
print "Here's some more debugging info:\n";
print_r($_FILES);
} else {
print "Possible file upload attack! Here's some debugging info:\n";
print_r($_FILES);
}
print "</pre>";
Nguồn : hspb
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment