Xử lý file (tập tin) trong PHP
- 13-03-2023
- Toanngo92
- 0 Comments
Mục lục
Upload file
Các tệp có thể được tải lên máy chủ bằng cách sử dụng tập lệnh PHP cùng với biểu mẫu HTML, Ban đầu, các tệp được tải lên một thư mục tạm thời. Thông qua tập lệnh PHP, các tệp này sau đó có thể được chuyển đến đích đích sau đó. Để kiểm tra, bạn có thể sử dụng hàm phpinfo() chứa thông tin xác định thư mục tạm thời, đó là upload_tmp_dir, được sử dụng để tải tệp lên. Nó cũng bao gồm upload_max_size mô tả kích thước tệp tối đa được phép có thể tải lên thành công. Tệp cấu hình php.ini PHP bao gồm các tham số này.
Người dùng có thể thực hiện quy trình sau để tải tệp lên:
- Mở trang bao gồm một biểu mẫu HTML có nút gửi, nút duyệt và tệp văn bản.
- Nhấp hoặc nhấn vào nút duyệt để chọn tệp để tải lên từ máy tính.
- Đường dẫn đầy đủ của tệp đã chọn hiển thị trong trường văn bản. Nhấp vào nút gửi.
- Tệp đã chọn sẽ được chuyển vào thư mục tạm thời của máy chủ.
- Tập lệnh PHP được chỉ định làm trình xử lý biểu mẫu nằm trong thuộc tính action khi file đã đưược chọn
- Sau đó, tập tin được sao chép vào thư mục định sẵn.
- Cuối cùng, tập lệnh PHP xác nhận thành công cho người dùng.
Lưu ý: phải có quyền ghi tệp cho cả vị trí (thư mục) cuối cùng và tạm thời. Quá trình chắc chắn sẽ thất bại nếu một trong hai điều này được xác định là chỉ đọc. Một tệp được tải lên có thể là một định dạng file bất kỳ như tài liệu, tệp hình ảnh hoặc tệp văn bản….
Tạo form upload và xử lý upload
Sử dụng biểu mẫu HTML, mã PHP cho phép người dùng tải tệp lên máy chủ. Ban đầu, các tệp được đặt trong một thư mục tạm thời. Sau đó, một tập lệnh PHP được sử dụng để di chuyển các tệp đến thư mục đích.
Ví dụ:
Tạo file php ví dụ uploadfile.php và viết HTML form kèm một <input type=”file”/>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file1">
<input type="submit" name="submit" value="Upload">
</form>
</body>
</html>
Biến PHP toàn cục $_FILES là một mảng hai chiều liên kết duy trì tất cả thông tin bắt buộc được liên kết với một tệp đã tải lên. PHP sẽ tạo 5 biến (5 index bên trong biến toàn cục $_FILES) nếu giá trị được phân bổ cho thuộc tính name thẻ input là file. Các biến này được đề cập như sau:
- error: mã lỗi liên quan tới file upload
- Multipurpose Internet Mail Extensions (MIME): loại tệp đã tải lên
- name: Tên thật của file đã tải lên
- size: kích thước của file đã tải lên
- tmp_name: tệp đã tải lên nằm trong thư mục tạm thời trên máy chủ Web
Ví dụ:
Tiếp tục bổ sung logic upload cho file uploadfile.php
<?php
if (isset($_POST['submit'])) {
if (isset($_FILES['file1'])) {
// var_dump($_FILES['file1']);
$file = $_FILES['file1'];
// lay ten file
$fileName = $file['name'];
// lay extesion cua file
$fileType = $file['type'];
// lay vi tri file luu tam thoi tren server .tmp
$fileTempName = $file['tmp_name'];
// lay ra thong tin xem file co loi hay khong
$fileError = $file['error'];
// lay ra kich thuoc file
$fileSize = $file['size'];
// phan tach ten file ra lay ra ten file va extension va chyen thanh mang
$fileExt = explode('.', $fileName);
// lay ra extesion
$fileActualExt = strtolower(end($fileExt));
// lay ra mang extension cho phep upload
$allowed = array('jpg', 'jpeg', 'png', 'pdf');
if(!file_exists('uploads')){
mkdir('uploads',777);
}
if (in_array($fileActualExt, $allowed)) {
if ($fileError === 0) {
if ($fileSize < 1000000) {
$fileNameNew = uniqid('', true) . "." . $fileActualExt;
$fileDestination = 'uploads/' . $fileNameNew;
$result = move_uploaded_file($fileTempName, $fileDestination);
if ($result) {
header("Location: uploadfile.php?uploadsuccess=true");
} else {
echo "Upload failed";
}
} else {
echo "Your file is too big!";
}
} else {
echo "There was an error uploading your file!";
}
} else {
echo "You cannot upload files of this type!";
}
}
}
if (isset($_GET['uploadsuccess'])) {
echo "Your file has been uploaded successfully!";
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file1">
<input type="submit" name="submit" value="Upload">
</form>
</body>
</html>
Nếu tệp đã được tải lên, phần mở rộng tệp không hợp lệ hoặc kích thước tệp vượt quá giới hạn, v.v., thông báo lỗi thích hợp sẽ được hiển thị trên trình duyệt dựa trên lỗi cụ thể.
Hệ thống tệp PHP cho phép người dùng thực hiện các tác vụ xử lý tệp khác nhau. Chúng bao gồm tạo, viết, xóa, nối thêm và đóng tệp. Nó cũng cho phép họ đọc từng ký tự một tệp và từng dòng một.
Mở file/ đóng file
<?php
// Open a text file for reading and writing
$file = fopen("example.txt", "a+");
// Write a message to the file
fwrite($file, "Hello world!");
// Read the contents of the file and output it to the browser
echo fread($file, filesize("example.txt"));
// Close the file handle when you are done with it
fclose($file);
?>
Đọc file
$file = "example.txt";
if (file_exists($file)) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
readfile($file);
} else {
echo "File not found.";
}
Ghi file
Hàm fwrite() trong PHP giúp ghi một số nội dung của (các) chuỗi vào một file.
Cú pháp:
int fwrite (resource $handle, string $string [, int $length ])
Ví dụ:
$file = fopen("example.txt", "w");
$txt = "This text will be written to the file.";
fwrite($file, $txt);
fclose($file);
Xóa file
Người dùng có thể xóafile bằng hàm unlink()
Cú pháp:
bool unlink (string $filename [, resource $context ])
$file_to_delete = '/path/to/file';
if(unlink($file_to_delete)) {
echo "File has been deleted successfully.";
} else{
echo "There was an error deleting the file.";
}
Thao tác với file
PHP có nhiều chức năng để đọc, chỉnh sửa, tạo và tải tệp lên. Tuy nhiên, điều quan trọng là phải thận trọng trong khi thao tác với tệp. Một động thái sai có thể gây bất lợi cho hệ thống máy tính.
Sau đây là các lỗi phổ biến xảy ra trong quá trình thao tác tệp:
- Xóa nội dung của một tập tin
- Ổ cứng bị đầy trong dữ liệu rác
- Chỉnh sửa tệp sai
Ngoài ra, chúng ta còn một sô hàm như:
- fgets(): đọc chuỗi trong file (ngắt chuỗi khi gặp ký tự new line)
- feof(): kiểm tra xem file đã kết thúc chưa
- fgetc(): đọc ký tự trong file
Bài tập
Dựa vào nội dung bài tập QLSV, tạo một file profile.php để cho người dùng có thể cập nhật hồ sơ cá nhân với giao diện như hình:
Yêu cầu: avatar phải là file ảnh (jpg,png,gif), kích thước nhẹ hơn 1MB.