# Laravel File System
Laravel cung cấp một hệ thống file system mạnh mẽ giúp quản lý và thao tác với các tệp tin và thư mục trong ứng dụng Laravel của bạn. Hệ thống file này được cấu hình linh hoạt và hỗ trợ nhiều đồng bộ và không đồng bộ với nhiều loại lưu trữ, bao gồm local file systems, Amazon S3, và các lưu trữ đám mây khác.
Dưới đây là một số khái niệm cơ bản và cách sử dụng Laravel File System:
### Cấu Hình File System
Cấu hình của hệ thống file Laravel được đặt trong tệp `config/filesystems.php`. Bạn có thể xác định các disk (đĩa) khác nhau, mỗi disk có thể sử dụng một loại lưu trữ khác nhau.
### Sử Dụng Disk
Laravel cho phép bạn sử dụng nhiều disk trong cùng một ứng dụng. Một số disk phổ biến bao gồm:
- `local`: Disk này lưu trữ tệp tin trên server local.
- `public`: Giống như `local`, nhưng được truy cập thông qua HTTP và có thể được chia sẻ với bên ngoại.
- `s3`: Disk này sử dụng Amazon S3 để lưu trữ tệp tin.
### Các Thao Tác Cơ Bản
Dưới đây là một số thao tác cơ bản bạn có thể thực hiện với Laravel File System:
#### 1. Ghi Tệp Tin:
```php
use Illuminate\Support\Facades\Storage;
Storage::disk('local')->put('file.txt', 'Contents');
```
#### 2. Đọc Tệp Tin:
```php
$contents = Storage::disk('local')->get('file.txt');
```
#### 3. Kiểm Tra Sự Tồn Tại của Tệp Tin:
```php
$exists = Storage::disk('local')->exists('file.txt');
```
#### 4. Xóa Tệp Tin:
```php
Storage::disk('local')->delete('file.txt');
```
#### 5. Sao Chép và Di Chuyển Tệp Tin:
```php
Storage::disk('local')->copy('file.txt', 'newfile.txt');
Storage::disk('local')->move('file.txt', 'newfile.txt');
```
# II. Cấu hình Public Disk
Để cấu hình disk `public` trong Laravel, bạn cần thực hiện một số bước trong tệp `config/filesystems.php`. Disk `public` thường được sử dụng để lưu trữ các tệp tin có thể truy cập từ bên ngoài thông qua HTTP.
Dưới đây là một hướng dẫn cơ bản:
### Bước 1: Cấu Hình trong filesystems.php
Mở tệp `config/filesystems.php` và thêm hoặc sửa mục `"disks"` như sau:
```php
'disks' => [
// ...
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
// ...
],
```
Trong đoạn mã trên:
- `'driver' => 'local'`: Disk sử dụng hệ thống file local (trong thư mục `storage/app/public`).
- `'root' => storage_path('app/public')`: Thư mục gốc của disk.
- `'url' => env('APP_URL').'/storage'`: URL truy cập được sử dụng để truy cập tệp tin từ bên ngoài ứng dụng. Đảm bảo bạn có biến môi trường `APP_URL` trong tệp `.env`.
- `'visibility' => 'public'`: Điều này đảm bảo rằng các tệp tin được lưu trữ trong disk có thể được truy cập từ bên ngoài thông qua HTTP.
### Bước 2: Chạy Câu Lệnh Artisan
Sau khi bạn đã cấu hình disk, chạy câu lệnh Artisan `storage:link` để tạo liên kết tượng trưng từ `public/storage` đến `storage/app/public`:
```bash
php artisan storage:link
```
Câu lệnh trên tạo một liên kết tượng trưng giúp Laravel định tuyến các URL bắt đầu bằng `public/storage` đến thư mục `storage/app/public`.
Bằng cách sử dụng câu lệnh storage:link, bạn tạo ra một liên kết tượng trưng từ public/storage đến thư mục storage/app/public. Điều này có nghĩa là khi người dùng truy cập URL như http://your-app.com/storage/file.txt, Laravel sẽ tự động định tuyến nó đến tệp tin storage/app/public/file.txt.
Sau khi hoàn thành các bước trên, bạn có thể sử dụng disk `public` để lưu và truy cập các tệp tin trong ứng dụng Laravel của mình.
# III. Upload public file
Khi người dùng tải lên (upload) một tệp tin trong Laravel, bạn có thể sử dụng Laravel File System để lưu nó vào một disk cụ thể. Dưới đây là một ví dụ về cách thực hiện điều này:
### Bước 1: Cấu Hình Disk
Trước tiên, hãy đảm bảo rằng bạn đã cấu hình các disks trong tệp `config/filesystems.php`. Bạn có thể sử dụng disk mặc định là `public` để lưu trữ các tệp tin có thể truy cập được từ bên ngoài:
```php
'public' => [
'driver' => 'local',
'root' => public_path('uploads'),
'url' => env('APP_URL').'/uploads',
'visibility' => 'public',
],
```
### Bước 2: Xử Lý Tệp Tin Upload trong Controller
Trong phương thức xử lý tệp tin được tải lên trong controller, bạn có thể sử dụng Laravel File System để lưu tệp tin vào disk:
```php
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\Request;
public function uploadFile(Request $request)
{
$request->validate([
'file' => 'required|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
// Lưu tệp tin vào disk 'public'
$path = $request->file('file')->store('uploads', 'public');
// Lấy URL của tệp tin đã lưu
$url = Storage::disk('public')->url($path);
// Thực hiện các thao tác khác nếu cần
// Trả về phản hồi hoặc chuyển hướng
return response()->json(['url' => $url], 200);
}
```
Trong ví dụ này:
- `store('uploads', 'public')` lưu tệp tin vào thư mục `public/uploads` trên disk `public`.
- `Storage::url($path)` giúp bạn lấy URL của tệp tin đã lưu.
### Bước 3: Hiển Thị Tệp Tin Đã Lưu Trên Frontend
Sau khi tệp tin đã được lưu, bạn có thể sử dụng URL để hiển thị nó trong frontend.
```html
<img src="{{ $url }}" alt="Uploaded Image">
```
### Lưu Ý:
- Hãy đảm bảo thư mục đích (`public/uploads` trong ví dụ) đã tồn tại và có quyền ghi.
- Đối với disk `public`, Laravel sẽ tự động tạo liên kết tượng trưng trong thư mục `public` để có thể truy cập được từ HTTP.
- Với các tùy chọn khác và loại disk khác nhau, bạn có thể tùy chỉnh cấu hình disk trong `config/filesystems.php` tùy thuộc vào nhu cầu của bạn.