Giới thiệu về filesystem storage trong Laravel

Laravel Storage

Laravel cung cấp cho ta một lớp abstraction filesystem mạnh mẽ do sử dụng package Flysystem tạo bởi Frank de Jonge. Tích hợp Flysystem vào Laravel với cách sử dụng rất đơn giản để giao tiếp với các local filesystem, Amazon S3, và Rackspace Cloud Storage. Thậm chí còn có thể switch các storage một cách dễ dàng sử dụng chung API.

Lợi ích của Laravel storage:

- Việc lưu trữ các file sẽ tốn rất nhiều tài nguyên và băng thông trên server, giải pháp đưa ra là lưu trữ trên các server bên ngoài nên Laravel Storage được tích hợp hỗ trợ lưu trữ file trên server ngoài như Amazon S3.

- Đơn giản hóa trong việc thiết lập các tùy chon.

Cấu hình (Config):

File cấu hình được đặt tại "config/filesystems.php"  và được thiết lập sẵn như sau.

    /*
    |--------------------------------------------------------------------------
    | Default Filesystem Disk
    |--------------------------------------------------------------------------
    */

    'default' => env('FILESYSTEM_DRIVER', 'local'),

    /*
    |--------------------------------------------------------------------------
    | Default Cloud Filesystem Disk
    |--------------------------------------------------------------------------
    */

    'cloud' => env('FILESYSTEM_CLOUD', 's3'),

    /*
    |--------------------------------------------------------------------------
    | Filesystem Disks
    |--------------------------------------------------------------------------
    */

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => env('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
        ],

    ],

 

 Với Local Driver

Khi thao tác tới file sẽ tương tác tới thư mục root được khai báo trong file, giá trị mặc định được trỏ tới storage/app. Do đó với đoạn code sau file sẽ được lưu trong storage/app/file.txt:

    Storage::disk('local')->put('file.txt', 'Contents');

Với config driver là S3 hoặc Rackspace cần cài đặt các package như yêu cầu thông qua composer

  • Amazon S3: league/flysystem-aws-s3-v3 ~1.0
  • Rackspace: league/flysystem-rackspace ~1.0

Cấu hình cho FTP Driver

Mặc định FTP driver không được cấu hình mặc định trong filesystems.php. Bạn có thể sử dụng ví dụ cấu hình dưới đây như Laravel Docs:

    'ftp' => [
		'driver'   => 'ftp',
		'host'     => 'ftp.example.com',
		'username' => 'your-username',
		'password' => 'your-password',

		// Optional FTP Settings...
		// 'port'     => 21,
		// 'root'     => '',
		// 'passive'  => true,
		// 'ssl'      => true,
		// 'timeout'  => 30,
	]

Cấu hình cho Rackspace Driver

Cũng giống như FTP, Rackspace driver cũng không được config sẵn trong file filesystems.php.

Các bạn có thể tham khảo cấu hình sau:

    'rackspace' => [
		'driver'    => 'rackspace',
		'username'  => 'your-username',
		'key'       => 'your-key',
		'container' => 'your-container',
		'endpoint'  => 'https://identity.api.rackspacecloud.com/v2.0/',
		'region'    => 'IAD',
		'url_type'  => 'publicURL',
	]

Để sử dụng thư việc Storage các bạn đừng quên khai báo thư viện:

use Illuminate\Support\Facades\Storage;

Sau khi khai báo thư viện các bạn có thể tương tác với các disk đã được cấu hình.

	$disk = Storage::disk('local');
	// or
	$disk2 = Storage::disk('s3');

 

Giới thiệu các hàm cơ bản:

  • get(): Được dùng để lấy nội dung của một file:
$contents = Storage::get('file.txt');
  • exists(): Kiểm tra sự tồn tại của 1 file:
$exists = Storage::disk('local')->exists('file.txt');
  • url(): Để lấy URL của file. Nếu bạn sử dụng local driver, nó sẽ tự động thêm vào "/storage" cho path và trả về một relative URL của file. Nếu bạn sử dụng s3 driver, URL đầy đủ sẽ được trả về.

Chú ý: Khi sử dụng local driver, hãy chắc chắn tạo một symbolic link tại public/storage trỏ tới thư mục storage/app/public.

$url = Storage::url('file.txt');
  • size(): Trả về kích thước của file, đơn vị là bytes:
$size = Storage::size('file.txt');
  • lastModified(): Trả về giá trị UNIX timestamp của lần cuối cùng file bị thay đổi:
$time = Storage::lastModified('file.txt');
  • put(): Có thể được dùng để lưu file lên disk. Ta cũng có thể truyền một PHP resource cho hàm put, nó sẽ sử dụng stream của Flysystem. Bạn nên sử dụng stream khi phải làm việc với file lớn:
Storage::put('file.txt', $contents);
Storage::put('file.txt', $resource);
  • copy(): Dùng để copy một file đang tồn tại sang một vị trí mới trên disk:
Storage::copy('old/file.txt', 'new/file.txt');
  • move(): Dùng để đổi tên hay di chuyển một file đang tồn tại tới vị trí mới:
Storage::move('old/file.txt', 'new/file.txt');
  • prepend(): Thêm nội dung vào đầu 1 file:
Storage::prepend('file.txt', 'Prepended Text');
  • append(): Chèn thêm nội dung vào cuối file:
Storage::append('file.txt', 'Appended Text');
  • delete(): Xoá file khỏi disk, bạn có thể xóa 1 file hoặc 1 mảng các file:
Storage::delete('file.txt');
Storage::delete(['file1.txt', 'file2.txt']);
  • files(): Trả về một mảng các files trong một thư mục.
$files = Storage::files($directory);
  • allFiles(): Sẽ lấy danh sách tất cả các file trong một thư mục bao gồm các thư mục con:
$files = Storage::allFiles($directory);
  • directories(): Sẽ trả về một mảng gồm tất cả các thư mục bên trong một thư mục.
$directories = Storage::directories($directory);
  • allDirectories(): Hàm này lấy về danh sách tất cả các thư mục trong một thư mục và các thư mục con của nó:
$directories = Storage::allDirectories($directory);
  • makeDirectory(): Sẽ tạo một thư mục mới, bao gồm các thư mục con cần thiết:
Storage::makeDirectory($directory);
  • deleteDirectory(): Xoá một thư mục, bao gồm tất cả các file của nó:
Storage::deleteDirectory($directory);
  • download(): Tải file về máy tính.
return Storage::download('file.jpg');

Mong rằng qua bài này sẽ giúp các bạn hiểu hơn về Storage trong Laravel. Các bạn có thể xây dựng một hệ thống quản lý các media của mình trên server một cách dễ dàng hơn. Chúc các bạn thành công trong lập trình Laravel.

Ngụy Kim Hưng