Другое дело.
Чтобы файлы не были доступны по ссылке, не нужно их размещать в публичной директории.
Я делал так:
Регистрируем маршрут
Route::get('p/attach/{id}', [AttachmentController::class, 'show'])
->name('attachment.show')
->middleware(['auth']);
Маршрут закрыт аутентификацией, только зарегистрированные пользователи могут получить доступ. Но вы можете любые другие условия организовать.
Регистрируем приватный диск
// config/filesystem.php
'private' => [
'driver' => 'local',
'root' => storage_path('app/private'),
'visibility' => 'public',
],
Можно просто в уже имеющийся локальный скидывать (local, не public), но я предпочитаю порядок.
Далее все загружаемые картинки сохраняем на этот диск.
В моем случае картинки являются аттачами и ссылки на них хранятся в базе.
Пишем метод для отображения пикчи:
// AttachmentController.php
public function show($id, Request $request, Response $response)
{
// Здесь любая логика проверки прав на просмотр файла.
// ...
/** @var Attachment $attach */
$attach = Attachment::findOrFail($id);
$path = Storage::disk('private')->path($attach->path.$attach->name.'.'.$attach->extension);
return response()->file($path);
}
Здесь мы получаем из роута идентификатор вложения читаем его и отдаем в ответ.
Для формирования ссылки сделал хелпер
privateUrl(Attachment $attachment)
{
return route('attachment.show', [
'id' => $attachment->id,
]);
}
@foreach($files as $attachment)
<a class="text-underline"
target="_blank"
href="{{ privateUrl($attachment) }}"
>{{ $attachment->original_name }}</a>
@endforeach
PS.
Класс Attachment не является частью фреймворка. Это модель для управления загружаемыми файлами.
Но в целом, я думаю, вам понятен принцип.