Dùng Amazon S3 để lưu trữ file trong Laravel

    Nếu bạn có một website dạng bình thường không cần lưu trữ quá nhiều hình ảnh, video hay các tệp tin khác thì bạn có thể lưu trữ luôn ngay trên hosting, server của mình, nhưng một số website đặc thù cần lưu trữ một lượng lớn tệp tin mà hosting, server của bạn không đáp ứng được thì bắt buộc bạn phải sử dụng dịch vụ bên thứ 3 để lưu trữ.

    Amazon S3 (Simple Storage Service) là một dịch vụ tuyệt vời để lưu trữ tệp tin phổ biến nhất trong công nghệ điện toán đám may hiện nay, nó lưu trữ tệp tin như một object trong các bucket, quản lý version, tag.. và rất nhiều dịch vụ hay ho khác nữa. S3 cung cấp một API cũng khá dễ để developer chúng ta cài đặt và sử dụng.

    Tốc độ truy cập khi dùng Amazon S3 cũng rất nhanh so với tốc độ max rùa bò khi bạn dùng Google Drive

1. Đăng ký tài khoản S3

image

  • Chọn next, có một số dịch vụ bạn có thể chọn enable nó lên, không thì bỏ qua và tiếp tục bấm next
  • Để mặc định và tiếp tục bấm next, nó sẽ tự tạo bucket cho mình
  • Đấy chỉ mới xong bước tạo bucket

2. Tạo credentials để truy cập

  • Các bạn chọn Services trên header của website amazon và search IAM
  • Chọn Users và chọn Add user và điền tên user, tích chọn Access type là Programmatic access

image

  • Tiếp đến chọn Create group và chọn Policy type là AmazonS3FullAccess

image

  • Chọn next và chọn Create user
  • Lúc này bạn sẽ xem được Access key và Secret access key, nhớ phần này để chúng ta config trong Laravel

image

 3. Config trong Laravel

  • Để dụng được S3 bạn cần cài đặt package league/flysystem-aws-s3-v3
  • composer require league/flysystem-aws-s3-v3
  • Thêm biến vào file env, nếu không muốn thì bạn có thể thêm trực tiếp luôn vào config/filesystems.php
  • //file .env
    FILESYSTEM_DRIVER=s3
    
    S3_ACCESS_KEY_ID=key_id_vua_tao
    S3_SECRET_ACCESS_KEY=secret_key_id_vua_tao
    S3_REGION=region
    S3_BUCKET=bucket-name
    
    //file config/filesystems.php
    's3' => [
        'driver' => 's3',
        'key' => env('S3_ACCESS_KEY_ID'),
        'secret' => env('S3_SECRET_ACCESS_KEY'),
        'region' => env('S3_REGION'),
        'bucket' => env('S3_BUCKET'),
    ],
  • Nếu chưa biết region phải điền như thế nào thì cách đơn giản là bạn thử upload 1 file lên bucket, sau đó click chi tiết vào file bạn sẽ thấy đường dẫn, ví dụ như https://s3-ap-southeast-1.amazonaws.com/bucket-name/IAM.png thì region của bạn là ap-southeast-1 

4. Code upload file đơn giản

//FileController.php

$file = $request->file('file');
$fileName = $file->getClientOriginalName();

$uploadDir = 'upload/';
$fullpath = $uploadDir . $fileName;
Storage::disk('s3')->put($fullpath, file_get_contents($file), 'public');

$item = new FileModel();
$item->url = $fileName
$item->mimetype = $file->getClientMimeType();
$item->author_id = auth()->id();
$item->save();

 - Để lấy đường dẫn file

//FileModel.php

public function getSrc()
{
    $fullSrc = 'upload/' . $this->url;
    if (Storage::disk('s3')->exists($fullSrc)) {
        return Storage::disk('s3')->url($fullSrc);
    }
    return null;
}
//nếu cài đặt disk default trong filesystems rồi thì không cần viết Storage::disk('s3') nữa mà chỉ cần Storage::disk() là OK.
// Xóa file thì dùng hàm
Storage::disk()->delete($fullSrc);

Hi vọng bài viết có ích cho các bạn, nếu có sai sót gì mong các bạn góp ý, thanks!

 

Bài viết từ pinlaz.com