Метод download
Метод download класса Storage применяется для создания HTTP-ответа, который скачивает файл из файловой системы. Первым параметром передаётся путь к файлу, вторым необязательным - имя, под которым файл будет сохранён на компьютере пользователя, третьим - массив заголовков ответа. Если имя не указано, используется оригинальное имя файла.
Синтаксис
<?php
use Illuminate\Support\Facades\Storage;
Storage::download($path, $name, $headers);
?>
Пример
Давайте создадим простой маршрут, который скачивает файл из директории 'public':
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
Route::get('/download', function () {
return Storage::download('public/report.pdf');
});
?>
Результат выполнения кода:
"файл report.pdf скачан в браузере"
Пример
Скачаем файл и переименуем его при скачивании:
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
Route::get('/download-renamed', function () {
return Storage::download('public/report.pdf', 'annual_report.pdf');
});
?>
Результат выполнения кода:
"файл annual_report.pdf скачан в браузере"
Пример
Скачаем файл из локальной директории с указанием заголовков:
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
Route::get('/download-custom', function () {
$headers = [
'Content-Type' => 'application/pdf',
'Cache-Control' => 'no-cache, no-store, must-revalidate',
];
return Storage::download('public/manual.pdf', 'user_manual.pdf', $headers);
});
?>
Результат выполнения кода:
"файл user_manual.pdf скачан с кастомными заголовками"
Пример
Скачаем файл с другого диска, например, S3:
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
Route::get('/download-s3', function () {
return Storage::disk('s3')->download('uploads/photo.jpg', 'profile_photo.jpg');
});
?>
Результат выполнения кода:
"файл profile_photo.jpg скачан с S3 диска"
Пример
Скачаем файл и обработаем возможную ошибку, если файл не найден:
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
Route::get('/download-safe', function () {
if (Storage::exists('public/missing.pdf')) {
return Storage::download('public/missing.pdf');
}
Log::error('File not found: public/missing.pdf');
return response()->json(['error' => 'File not found'], 404);
});
?>
Результат выполнения кода:
{"error":"File not found"}
Пример
Скачаем файл из контроллера, используя dependency injection:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileController extends Controller
{
public function download(Request $request)
{
$path = $request->input('file', 'default.pdf');
$name = $request->input('name', null);
if (!Storage::exists($path)) {
return response()->json(['error' => 'File not found'], 404);
}
return Storage::download($path, $name);
}
}
?>