Да, это практически единственный способ, если вы храните изображения в недоступном для общественности пути.
Для ускорения вы можете сделать это с помощью простого PHP (заголовки + чтение файла):
$type = "image/jpeg";
header('Content-Type: image/jpeg');
header('Content-Length: ' . filesize($thumbnail));
readfile($thumbnail);
exit;
или если вы хотите сохранить его в коде типа Laravel, то что-то вроде этого вполне подойдет
$headers = [
'Content-Type' => 'image/jpeg', // if single type if not determine type
'Content-Length' => filesize($thumbnail),
];
return response()->file($thumbnail, $headers);
Вы можете оптимизировать это с помощью кэширующих заголовков и любых других другой ароматизатор.
Для нескольких изображений вам придется делать отдельные запросы для каждого изображения, или вам нужно каким-то образом архивировать изображения и отправлять их пользователю, но, очевидно, пользователь не сможет их просмотреть, если только недостигнутый загруженный пакет.