File upload - tải tập tin lên máy chủ


tự học php nâng cao 07/07/2015 Cùng chuyên mục

File upload là một tính năng quan trọng trong nhiều ứng dụng web:đăng ký thành viên - tải ảnh đại diện; quản sản phẩm: tải ảnh sản phẩm,...

FORM FILE UPLOAD:

Một file có thể được tải thông qua HTTP POST. Dưới đây là ví dụ một form dùng để tải file:

<form action="upload_process.php" enctype="multipart/form-data" method="POST">
<input name="MAX_FILE_SIZE" type="hidden" value="1024" /><br />
<input name="file_data" type="file" /><br />
<input type="submit" value="Send file" />
</form>

Lưu ý: muốn gửi file lên server thì form phải đặt thuộc tính enctype="multipart/form-data"

- MAX_FILE_SIZE: giới hạn kích thước file tải lên, tính bằng byte - tuy nhiên người dùng có thể tác động để chỉnh sửa mã html. Do đó, trên server cũng phải cấu hình, để giới hạn file được tải lên trong file cấu hình php.ini
- post_max_size = 8000; #kích thước bộ nhớ dành cho việc được tải lên, tính bằng byte#
- upload_max_filesize: 2000; #kích thước tối đa của file được tải lên, tính bằng byte#
- max_input_time: 30; #thời gian tối đa để tải dữ liệu lên server tính bằng giây#

Khi một file được tải lên server - nó sẽ được lưu trữ tại một thư mục tạm (tempory directory) file sẽ có phần mở rộng .tmp . Dữ liệu về file upload sẽ được truy xuất thông qua mảng $_FILE với các thông tin sau:
- name: tên file được tải lên
- type: loại file như image/png image/jpg...được phân chia bởi trình duyệt
- tmp_name:  tên file ở trong thư mục tạm
- error: các lỗi trong quá trình upload - giá trị của biến UPLOAD_ERR_OK:
- 0: tải file thất bại
- 1: tải file thành công
Một số giá trị khác của error:
- 2: kích thước file lớn hơn MAX_FILE_SIZE
- 4: không có file nào được tải lên
- 6: không thấy thư mục lưu tạm
- 8: không thể ghi file vào ổ đĩa

Để kiểm tra xem việc upload có thành công hay không, kiểm tra biến UPLOAD_ERR_OK. Có một cách khác là kiểm tra xem kích thước file tmp_name, nếu khác 0 nghĩa là tải file thành công. Các bạn cần nắm rõ giá trị biến này để có những bước xử lý co tốt - ví dụ: nếu bảo lỗi không thể ghi file vào ổ đĩa => kiểm tra phân quyền của thư mục có quyền ghi hay không?, thư mục có tồn tại hay không?

Bạn có thể dùng hàm: is_uploaded_file() - để kiếm tra xem đó có phải là file được tải lên - trong trường hợp người dùng là kẻ tấn công. Để di chuyển file được tải lên sang thư mục mong muốn sử dụng hàm move_uploaded_file().

Bước 1: tạo giao diện upload file - tạo file index.php trong thư mục hoc_php

<!doctype html>
<html>
<head>
<title>Tai file len server</title>
</head>
<body>
	<form action="upload_process.php" enctype="multipart/form-data" method="POST">
	<input name="MAX_FILE_SIZE" type="hidden" value="30000" /><br />
	<input name="file_data" type="file" /><br />
	<input type="submit" value="Send file" />
	</form>
</body>
</html>

Bước 2: tạo file xử lý - upload_process.php trong thư mục hoc_php

<?php
	//uploaddir lấy ra đường dẫn thư mực sẽ upload - giả sử là thư mục upload trong thư mục gốc
	$uploaddir = $_SERVER["DOCUMENT_ROOT"]."/upload/";	
	//basename: lấy ra tên file trong mảng $_FILES
	$uploadfile = $uploaddir.basename($_FILES['file_data']['name']);	
	//di chuyển file upload từ thư mục tạm sang thư mục upload
	if (move_uploaded_file($_FILES['file_data']['tmp_name'], $uploadfile))
	{
		echo "File được tải lên thành công.\n";
	} 
	else 
	{
		switch($_FILES['file_data']['error'])
		{
			case 0:
			echo "Không thể tải file lên hệ thống!\n";
			break;
			case 2:
			echo "Kích thước file vượt quá mức cho phép!";
			break;
			case 4:
			echo "Không có file nào được chọn để gửi lên!";
			break;
			case 6:
			echo "Không tìm thấy thư mục lưu tạm!";
			break;
			case 8:
			echo "Không thể ghi file vào ổ đĩa!";
			break;
			default:
			echo "Lỗi! không thể tải file lên hệ thống";
			break;
		}		
	}
	echo 'Thông tin file upload:';
	print_r($_FILES);
?>

Tải nhiều file lên server:

Sử dụng html array, làm tên của input, $_FILE["pictures"] ["name"] trở thành 1 mảng - là tên của các file đã upload. Tương tự các thông tin khác như tmp_name, error - bây giờ là 1 mảng. 

Bước 1: tạo giao diện upload file - tạo file index.php trong thư mục hoc_php

<!doctype html>
<html>
<head>
<title>Tai file len server</title>
</head>
<body>	
	<form action="upload_process.php" enctype="multipart/form-data" method="post">
    <input name="MAX_FILE_SIZE" type="hidden" value="30000" /><br/>
	Pictures:<br/>
	<input name="pictures[]" type="file" /><br/>
	<input name="pictures[]" type="file" /><br/>
	<input name="pictures[]" type="file" /><br/>
	<input type="submit" value="Send"/>
	</form>
</body>
</html>

Bước 2: tạo file xử lý - upload_process.php trong thư mục hoc_php

<?php
	//uploaddir lấy ra đường dẫn thư mực sẽ upload - giả sử là thư mục upload trong thư mục gốc
	$uploaddir = $_SERVER["DOCUMENT_ROOT"]."/upload/";
	//duyệt từng file tải lên
	$i=0;
	$file = $_FILES["pictures"]["name"];
	$tmp = $_FILES["pictures"]["tmp_name"];
	foreach ($_FILES["pictures"]["error"] as $key => $error) 
	{		
		//nếu tải lên thành công
		if ($error == UPLOAD_ERR_OK) 
		{
			$uploadfile = $uploaddir.basename($file[$i]);
			//di chuyển file upload từ thư mục tạm sang thư mục upload
			if (move_uploaded_file($tmp[$i], $uploadfile))
			{
				echo "File $file[$i] được tải lên thành công.<br>";
			} 
			else 
			{
				switch($error)
				{
					case 0:
					echo "Không thể tải file lên hệ thống!";
					break;
					case 2:
					echo "Kích thước file vượt quá mức cho phép!";
					break;
					case 4:
					echo "Không có file nào được chọn để gửi lên!";
					break;
					case 6:
					echo "Không tìm thấy thư mục lưu tạm!";
					break;
					case 8:
					echo "Không thể ghi file vào ổ đĩa!";
					break;
					default:
					echo "Lỗi! không thể tải file lên hệ thống";
					break;
				}		
			}
		}
		else
		{
			echo "Không thể tải file lên hệ thống!";
		}
		$i++;
	}
?>

KẾT THÚC:

Bài này, giới thiệu sơ lược về tính năng tải file lên server của php.  




Bình luận:


php