Как я должен служить изображению с Laravel?

Я сохраняю фотографии профиля пользователя в папке хранения laravel вместо общей папки, потому что я хотел бы сохранить общую папку в чистоте от пользовательского беспорядка.

Чтобы обслуживать образ из этой папки, я создал простое действие контроллера следующим образом:

public function profilePicture($person, $size = 40){ $profile_picture_url = storage_path().'/profile_pictures/'.$person['id'].'/profile_'.$size.'.jpg'; if(!File::exists( $profile_picture_url )) App::abort(404); return Image::make($profile_picture_url)->response('jpg'); } 

Можно ли считать это хорошей практикой или просто сохранить фотографии в общей папке? Будут ли я сталкиваться с проблемами производительности?

Короткий ответ на ваш вопрос

Можно ли считать это хорошей практикой или просто сохранить фотографии в общей папке? Будут ли я сталкиваться с проблемами производительности?

Это не рекомендуется, потому что вы читаете файл и заново его генерируете, что потребует времени процесса и загрузки сервера, но все сказанное зависит от количества запросов, размера изображения и т. Д. Я использовал эту практику для защиты / защиты изображений / файлов из общедоступного доступа, поэтому только аутентифицированный член может получить доступ к изображениям / файлам, как в этом ответе . Опять же, в зависимости от размера файла, количества запросов и спецификации сервера, я использовал его на время, и у меня не было проблем с производительностью, он отлично работал (мой сервер – 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}', 'ImagesController@profilePicture'); 

После создания маршрута нам нужно создать контроллер, чтобы следить за запросами изображений с нашего маршрута.

Создать 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 

Он покажет ваш образ, я сделал это сам и протестировал его. введите описание изображения здесь

Примечание. Я попытался максимально эффективно создать папку, отражающую ваш вопрос, но вы можете легко изменить ее, чтобы она соответствовала вашему желанию.


Установите Intervention (пропустите эту часть, если вы ее уже установили)

Следуйте этому руководству: http://image.intervention.io/getting_started/installation

Вкратце: php composer require intervention/image

И In в вашем config/app массив $ providers добавляет поставщиков услуг для этого пакета.

 Intervention\Image\ImageServiceProvider::class 

Добавьте фасад этого пакета в массив $ aliases.

 'Image' => Intervention\Image\Facades\Image::class 

Решение, основанное на этом ответе, но в том, чтобы защитить изображение с помощью аутентификации в целом и этого ответа .

В вашей модели User.php :

 protected $appends = ['avatar']; public function getAvatarAttribute($size=null) { return storage_path().'/profile_pictures/'.$this->id.'/profile_'.$size.'.jpg'; } 

Поэтому всякий раз, когда вы вызываете экземпляр пользователя, у вас будет его аватар вместе с ним.

Использование Laravel 5.2+ Image::make($pathToFile)->response() можно считать плохой практикой. Любой, кто ищет решение для обслуживания изображений из Laravel, должен использовать return response() -> file($pathToFile, $headers); , Это приведет к значительно меньшему накладному расходам, поскольку он просто служит файлу вместо «открытия его в Photoshop» – по крайней мере, это то, что говорит мой процессорный монитор.

Вот ссылка на документацию

 Response::stream(function() use($fileContent) { echo $fileContent; }, 200, $headers); 

https://github.com/laravel/framework/issues/2079#issuecomment-22590551