Upload và Resize Hình Ảnh Trong Laravel

BBMCode đã đăng vào lúc 10:08:07 13/08/2024 | đọc khoảng 4 phút, có 636 từ

Trong bài viết này, chúng ta sẽ tìm hiểu cách upload và resize hình ảnh trong Laravel, một công việc hay gặp khi lập trình website bằng Laravel.

 

Trước khi bắt đầu, hãy chắc chắn rằng bạn đã cài đặt Laravel trên hệ thống của mình. Nếu chưa, bạn có thể cài đặt Laravel bằng Composer với lệnh sau:

 

composer create-project --prefer-dist laravel/laravel myproject

 

Sau khi cài đặt Laravel, chúng ta sẽ cần cài đặt thêm thư viện Intervention Image để xử lý việc resize hình ảnh. Chạy lệnh sau để cài đặt:

 

composer require intervention/image

 

Tiếp theo, hãy đăng ký Service Provider của thư viện này trong config/app.php:

 

'providers' => [
    // ...
    Intervention\Image\ImageServiceProvider::class,
],
'aliases' => [
    // ...
    'Image' => Intervention\Image\Facades\Image::class,
],

 

Giả sử mình tạo UI đơn giản, với form upload hình như sau:

 

<form action="/upload" method="POST" enctype="multipart/form-data">
    @csrf
    <input type="file" name="image">
    <button type="submit">Upload to BBMCode</button>
</form>

 

Tiếp theo, chúng ta sẽ xử lý hình ảnh được upload trong controller. Hãy tạo một controller mới bằng lệnh sau:

 

php artisan make:controller ImageUploadController

 

Trong ImageUploadController, chúng ta sẽ viết methoid store để xử lý việc upload và resize hình ảnh:

 

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Image;

class ImageUploadController extends Controller
{
    public function store(Request $request)
    {
        // validate file upload
        $request->validate([
            'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        ]);

        $image = $request->file('image');

        // Tạo tên file mới để tránh bị trùng
        $filename = time().'.'.$image->getClientOriginalExtension();

        // Set path để chứa hình ảnh sau khi upload
        $destinationPath = public_path('/images');

        // Resize hình và lưu lại. Resize kích thước 300x300
        $resize_image = Image::make($image->getRealPath());
        $resize_image->resize(300, 300, function($constraint) {
            $constraint->aspectRatio();
        })->save($destinationPath . '/' . $filename);

        return back()->with('success', 'Image uploaded successfully');
    }
}

 

Trong đoạn code trên:

- Sử dụng phương thức validate để check file là file hình và có kích thước tối đa là 2MB.

- Sau đó, file hình được lấy từ request và đặt tên lại để tránh trùng lặp.

- Hình ảnh sau đó được resize với kích thước 300x300 pixel và lưu vào folder public/images.

 

Đây là một ví dụ cơ bản, tuy nhiên, bạn có thể mở rộng thêm để hỗ trợ nhiều định dạng hình ảnh hơn, hoặc thực hiện các thao tác phức tạp khác như cắt, thêm watermark...

 

Chúc các bạn thành công!