Подтвердить что ты не робот

Как я должен служить изображению с 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');
}

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

4b9b3361

Ответ 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.

Ответ 2

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

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

Ответ 3

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

protected $appends = ['avatar'];

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

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