Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як завантажувати великі файли прямо в S3, оминаючи сервер?

Через тимчасовий підписаний URL для завантаження: сервер лише видає дозвіл, а файл іде з браузера чи мобільного застосунку напряму в сховище.

public function store(Request $request): JsonResponse
{
    $path = 'uploads/'.$request->user()->id.'/'.Str::uuid().'.mp4';

    ['url' => $url, 'headers' => $headers] = Storage::disk('s3')->temporaryUploadUrl(
        $path, now()->plus(minutes: 10),
    );

    return response()->json(compact('url', 'headers', 'path'));
}

Клієнт робить PUT на url з headers, потім повідомляє застосунку path.

Чому це краще за завантаження через PHP:

  • великий файл не займає воркер PHP і не впирається в upload_max_filesize, post_max_size і таймаути;
  • немає подвійного трафіку «клієнт → сервер → S3».

Що контролює сервер:

  • шлях генерує сам (а не приймає від клієнта) - користувач пише лише у свою теку;
  • короткий термін дії URL;
  • після завантаження - перевірка: файл існує, розмір і тип відповідають очікуванням (Storage::size(), mimeType()), лише тоді запис у базі;
  • незавершені завантаження прибирає правило життєвого циклу бакета.

Підтримують драйвери s3 і local. Для перегляду приватних файлів - temporaryUrl().

Докладніше в документації: Тимчасові URL для завантаження

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання