Chuyển đến nội dung chính

第 8 課:文件儲存與媒體

檔案系統抽象(本地、S3、GCS)。文件上傳、驗證。斯帕蒂媒體庫。影像處理(幹預影像)。臨時 URL、串流下載。

💻 程式設計 — 第 8 課 第 8 課:文件儲存與媒體

Laravel:從基礎到高級

第 2 部分:資料庫和驗證

亞洲開發網

1. 檔案系統

use Illuminate\Support\Facades\Storage;

// Upload
$path = $request->file('avatar')->store('avatars', 'public');

// S3 config (config/filesystems.php)
's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
],

// Sử dụng
Storage::disk('s3')->put('path/file.jpg', $contents);
$url = Storage::disk('s3')->url('path/file.jpg');
$tempUrl = Storage::disk('s3')->temporaryUrl('path/file.jpg', now()->addMinutes(30));

2. 文件上傳

public function upload(Request $request)
{
    $request->validate([
        'file' => 'required|file|max:10240', // 10MB
        'image' => 'nullable|image|dimensions:min_width=100,max_width=2000',
    ]);

    $file = $request->file('file');
    $path = $file->storeAs(
        'uploads/' . now()->format('Y/m'),
        $file->hashName(),
        'public'
    );

    return response()->json(['url' => Storage::url($path)]);
}

3.Spatie媒體庫

composer require spatie/laravel-medialibrary
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;

class Product extends Model implements HasMedia
{
    use InteractsWithMedia;

    public function registerMediaConversions(?Media $media = null): void
    {
        $this->addMediaConversion('thumb')
            ->width(300)->height(300)
            ->sharpen(10);

        $this->addMediaConversion('preview')
            ->width(800)->height(600);
    }

    public function registerMediaCollections(): void
    {
        $this->addMediaCollection('images')->useDisk('s3');
        $this->addMediaCollection('documents')->singleFile();
    }
}

// Sử dụng
$product->addMediaFromRequest('image')->toMediaCollection('images');
$url = $product->getFirstMediaUrl('images', 'thumb');

4. 幹預影像

use Intervention\Image\Laravel\Facades\Image;

$image = Image::read($request->file('photo'))
    ->resize(800, null, function ($constraint) {
        $constraint->aspectRatio();
        $constraint->upsize();
    })
    ->toWebp(quality: 80);

Storage::put('photos/optimized.webp', $image);

下一篇: 身份驗證——Sanctum & Fortify。