Kỹ thuật lập trình PHP Lập trình PHP

Bài 15: Upload tập tin lên server trong PHP

I. Tạo form upload

Để upload tập tin cần phải có form và trường chọn tập tin hình ảnh để upload. Chúng tôi tạo form như sau:

<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
Chọn file:
<input type="file" name="fileupload">
<input type="submit" value="Upload " name="submit">
</form>

</body>
</html>

Khi tạo form upload cần lưu ý:

  • Phương thức method là POST
  • Phải có thuộc tính enctype=”multipart/form-data”
  • Phải có trường chọn tập tin để upload <input type=”file” name=”fileupload”>

II. Xử lý upload tập tin

a. Lưu tập tin

Tập tin sau khi upload sẽ được lưu trong thư mục tạm với tên tạm, các thông tin về tập tin upload được lưu trong biến $_FILES. Để xem các thông tin này sử dụng lệnh print_r()
print_r($_FILES);

Chúng tôi viết đoạn xử lý khi upload như sau, chúng tôi sẽ giải thích ngay bên dưới.

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileupload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileupload"]["tmp_name"]);
if($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
}
?>
  • $target_dir là thư mục sẽ lưu tập tin sau khi upload
  • $target_file là đường dẫn đầy đủ đến tập tin sau khi upload
  • $uploadOk làm một biến giúp xác định đã upload hay chưa
  • $imageFileType lưu phần mở rộng của tập tin

b. Kiểm tra tồn tại

Sau khi tập tin đã được upload, nó vẫn chưa nằm đúng thư mục cần upload. Chúng tôi sẽ kiểm tra tập tin đã tồn tại hay chưa trước khi chuyển tập tin đến thư mục upload.

if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}

Hàm file_exists giúp kiểm tra một tập tin đã tồn tại hay chưa. Kết quả trả về TRUE nếu tập tin đã tồn tại, ngược lại trả về FALSE.

c. Giới hạn kích thước tập tin

Để tránh trường hợp tải lên các tập tin quá lớn. Chúng tôi sẽ giới hạn tập tin lại trước khi lưu tập tin vào thư mục upload. Kích thước của tập tin được tính bằng byte

if ($_FILES["fileupload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}

d. Chuyển tập tin đã upload đến thư mục upload

Sau khi kiểm tra đầy đủ và tập tin thỏa mãn các yêu cầu biến $uploadOk có giá trị là 1, như vậy tập tin sẽ được chuyển đến thư mục upload.

if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["fileupload"]["tmp_name"], $target_file)) {
echo "The file ". basename( $_FILES["fileupload"]["name"]). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}