Ответ 1
Короткий ответ на ваш вопрос
Можно ли считать это хорошей практикой, или я просто хочу сохранить фотографии в общей папке? Я буду сталкиваться с проблемами производительности делаете это?
Это не рекомендуется, потому что вы читаете файл и заново его генерируете, для чего потребуется время процесса и загрузка сервера, но все сказанное зависит от количества запросов, размера изображения и т.д. Я использовал эту практику для защищать/защищать изображения/файлы от открытого доступа, поэтому только аутентифицированный член может получить доступ к изображениям/файлам, как в этом . Опять же, в зависимости от размера файла, количества запросов и спецификации сервера, я использовал его на время, и у меня не было проблем с производительностью, он отлично работал (мой сервер - 512MBMemory, 1 CoreProcessor, 20GBSSD Disk VPS solution). Вы можете дать ему попробовать и посмотреть.
Решение символьной ссылки
Также возможно создать символическую ссылку, например
ln -s /pathof/laravel/storage/profile_pictures /pathof/laravel/public/profile
Это решение не повлияет на производительность, но вам необходимо задокументировать решение в своей внутренней документации, если вы переместите свою установку на нового поставщика или в случае, если вам потребуется переустановка в папку хранения.
Но если вы все еще хотите получить полное решение для возврата изображения из папки хранения, прежде всего нам нужно установить Intervention Image для Laravel, я не уверен, что это уже сделано или нет. если вы установите его, продолжайте здесь, но если не выполните последнюю часть этого ответа и не продолжите решение Laravel.
Решение Laravel
Как сказано, мы предполагаем, что ваше вмешательство работает, прежде всего, вам нужно создать маршрут. Маршрут перенаправляет все запросы на получение изображения на наш контроллер.
Создать маршрут
Route::get('profile/{person}', '[email protected]');
После создания маршрута нам необходимо создать контроллер, чтобы выполнять запросы на изображение с нашего маршрута.
Создать ImagesController
Из команды
php artisan make:controller ImagesController
И ваш контроллер должен выглядеть так.
class ImagesController extends Controller {
public function profilePicture($person, $size = 40)
{
$storagePath = storage_path('/profile_pictures/' . $person . '/profile_' . $size . '.jpg');
return Image::make($storagePath)->response();
}
}
И не забудьте добавить
use Intervention\Image\Facades\Image;
в классе ImagesController
Наконец, убедитесь, что вы создали структуру папок с тестовым изображением.
storage/profile_pictures/person/profile_40.jpg
Теперь, если вы пишете в своем браузере
http://laravelLocalhostUrl/profile/person
Он покажет ваше изображение, я сделал это сам и испытал его.
Примечание. Я попытался максимально эффективно создать папку, отражающую ваш вопрос, но вы можете легко изменить его, чтобы он соответствовал вам.
Установить вмешательство (пропустите эту часть, если вы уже установили ее)
Следуйте этому руководству: http://image.intervention.io/getting_started/installation
Вкратце: php composer require intervention/image
И в вашем config/app
массиве $providers добавьте поставщиков услуг для этого пакета.
Intervention\Image\ImageServiceProvider::class
Добавьте фасад этого пакета в массив $aliases.
'Image' => Intervention\Image\Facades\Image::class
Решение, основанное на этом ответе, но для защиты изображения с аутентификацией в целом, и answer.