×

Cách viết class để resize hình ảnh sau khi upload trong PHP

Việc resize hình ảnh sau khi upload trong PHP là một công việc thường gặp trong phát triển web. Để thực hiện điều này một cách có tổ chức và hiệu quả, chúng ta có thể tạo một lớp (class) PHP để quản lý quá trình upload ảnh và resize hình ảnh một cách dễ dàng. Bài viết dưới đây sẽ hướng dẫn bạn chi tiết cách thực hiện điều này, nhằm giúp bạn có thể tự tin hơn khi cần xử lý ảnh trong các ứng dụng web của mình.

Giới thiệu về quá trình upload và resize hình ảnh

Khi làm việc với hình ảnh trên website, việc cho phép người dùng upload hình ảnh là rất phổ biến. Tuy nhiên, hình ảnh có thể có kích thước quá lớn, điều này không chỉ làm ảnh hưởng đến tốc độ tải trang mà còn có thể tiêu tốn nhiều tài nguyên máy chủ. Do đó, việc resize hình ảnh sau khi upload trở nên cần thiết. Lớp PHP mà chúng ta sắp xây dựng sẽ giúp thực hiện các bước upload và resize hình ảnh một cách tự động.

Tạo class ImageUploader

Đầu tiên, chúng ta sẽ bắt đầu bằng cách tạo một class có tên là ImageUploader. Class này sẽ có các thuộc tính và phương thức để xử lý việc upload và resize ảnh.

Cấu trúc class ImageUploader

class ImageUploader {
    private $uploadDir;
    private $maxFileSize;
    private $allowedFileTypes;

    public function __construct($uploadDir, $maxFileSize = 2000000, $allowedFileTypes = ['image/jpeg', 'image/png']) {
        $this->uploadDir = rtrim($uploadDir, '/') . '/';
        $this->maxFileSize = $maxFileSize;
        $this->allowedFileTypes = $allowedFileTypes;
    }

    public function upload($file) {
        if ($this->validateFile($file)) {
            $targetFile = $this->uploadDir . basename($file["name"]);
            if (move_uploaded_file($file["tmp_name"], $targetFile)) {
                return $targetFile;
            }
        }
        return false;
    }

    private function validateFile($file) {
        if (!in_array($file['type'], $this->allowedFileTypes)) {
            throw new Exception('File type not allowed.');
        }
        if ($file['size'] > $this->maxFileSize) {
            throw new Exception('File size exceeds the maximum limit.');
        }
        return true;
    }

    public function resizeImage($filePath, $width, $height) {
        list($originalWidth, $originalHeight) = getimagesize($filePath);
        $src = imagecreatefromstring(file_get_contents($filePath));
        $dst = imagecreatetruecolor($width, $height);

        imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);

        imagejpeg($dst, $filePath, 90); // Lưu lại hình ảnh
        imagedestroy($src);
        imagedestroy($dst);
    }
}

Chi tiết về từng phương thức trong class

1. Phương thức __construct()

Phương thức khởi tạo được sử dụng để thiết lập thư mục upload, kích thước file tối đa và định dạng file được phép. Điều này giúp class linh hoạt hơn nếu bạn cần thay đổi các thông số này sau này.

2. Phương thức upload()

Phương thức này thực hiện việc upload file. Nó sẽ gọi phương thức validateFile() để kiểm tra tính hợp lệ của file trước khi thực hiện upload. Nếu file hợp lệ, thì nó sẽ di chuyển file từ thư mục tạm thời đến thư mục đã chỉ định.

3. Phương thức validateFile()

Đây là một phương thức kiểm tra tính hợp lệ của file upload. Nó kiểm tra định dạng file, kích thước file và có thể ném ra ngoại lệ nếu không hợp lệ.

4. Phương thức resizeImage()

Phương thức này chịu trách nhiệm thực hiện resize hình ảnh. Nó sẽ lấy kích thước ban đầu của hình ảnh và tạo ra một hình ảnh mới với kích thước mà bạn chỉ định. Hình ảnh này sẽ được lưu lại với chất lượng 90%.

Sử dụng class ImageUploader

Sau khi đã xây dựng class ImageUploader, chúng ta có thể sử dụng nó trong một form upload đơn giản như sau:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $imageUploader = new ImageUploader('uploads/');

    try {
        $uploadedFile = $imageUploader->upload($_FILES['image']);
        if ($uploadedFile) {
            $imageUploader->resizeImage($uploadedFile, 800, 600);
            echo "Hình ảnh đã được upload và resize thành công!";
        }
    } catch (Exception $e) {
        echo "Lỗi: " . $e->getMessage();
    }
}
?>

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="image" required />
    <button type="submit">Upload</button>
</form>

Kết luận

Bằng cách sử dụng class ImageUploader, bạn có thể dễ dàng quản lý quá trình upload và resize hình ảnh trong ứng dụng PHP của mình. Class này không chỉ giúp mã của bạn trở nên gọn gàng và có tổ chức mà còn giúp bạn tiết kiệm thời gian trong tương lai khi cần xử lý hình ảnh.

Bạn có thể tùy chỉnh class này để phù hợp với nhu cầu của mình, chẳng hạn như thêm tính năng xóa hình ảnh, thay đổi kiểu lưu trữ hoặc tạo ra nhiều kích thước khác nhau của hình ảnh đã upload. Hy vọng bài viết này giúp bạn có cái nhìn sâu sắc hơn về cách làm việc với hình ảnh trong PHP!

Comments