WEB и WordPress новости, темы, плагины. Здесь мы делимся советами и лучшими решениями для сайтов.

Как загружать и сжимать изображения в Laravel

1 596

Вы ищете, как загружать и сжимать изображения в Laravel? Laravel предоставляет простой способ загрузки файлов. И сжатие изображений во время загрузки — хорошая практика. В этой статье я покажу вам, как загружать и сжимать изображения в Laravel.

Зачем нужно сжимать изображения?

Изображения играют важную роль на вашем сайте. Изображения улучшают пользовательский интерфейс и привлекают внимание посетителей. Но в то же время это также может снизить производительность сайта. Тяжелые изображения замедляют работу сайта. В результате ваш сайт долго загружается. Пользователи не любят медленные сайты. Если вашему сайту требуется больше времени для загрузки, высока вероятность того, что вы потеряете свою аудиторию. Стандартное время загрузки веб-сайта — 2 секунды. Вы должны позаботиться о том, чтобы ваш сайт загрузился в течение 2 секунд.

Хотя есть несколько факторов, которые необходимо учитывать, чтобы повысить скорость страницы, один из них — использование оптимизированных изображений. Сжатие изображений уменьшает размер исходного изображения без потери качества. Это помогает увеличить скорость сайта.

Сказав это, давайте посмотрим, как загружать и сжимать изображения в Laravel.

Загрузка изображений в Laravel

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

php artisan storage:link

Эта команда создает каталог хранилища в папке общего доступа.

Затем создайте форму с кнопкой ввода файла и отправки, добавив приведенный ниже код в свой файл лезвия.

<form action="{{ url('ROUTE_HERE') }}" method="post" enctype="multipart/form-data">     <div class="form-group">         <label for="exampleInputFile">File input</label>         <input type="file" name="profile_image" id="exampleInputFile">     </div>     {{ csrf_field() }}     <button type="submit" class="btn btn-default">Submit</button> </form>

В приведенном выше HTML я добавил ввод файла с именем profile_image. Я также добавил, {{ csrf_field() }}что требуется для отправки форм Laravel.

Теперь, предполагая, что вы отправляете почтовый запрос store()методу вашего контроллера, напишите код, который сохраняет изображение на сервере, как показано ниже.

public function store(Request $request) {     if($request->hasFile('profile_image')) {         //get filename with extension         $filenamewithextension = $request->file('profile_image')->getClientOriginalName();           //get filename without extension         $filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);           //get file extension         $extension = $request->file('profile_image')->getClientOriginalExtension();           //filename to store         $filenametostore = $filename.'_'.time().'.'.$extension;           //Upload File         $request->file('profile_image')->storeAs('public/profile_images', $filenametostore);           //Compress Image Code Here           return redirect('ROUTE_HERE')->with('success', "Image uploaded successfully.");     } }

Этот код создает уникальное имя файла и сохраняет файл в каталоге profile_images. Laravel автоматически создает каталог ‘profile_images’ в ‘public / storage’, если он не существует.

Как было сказано ранее, лучше оптимизировать изображение во время загрузки. Мы закончили с кодом загрузки изображения. Теперь нам нужно его сжать. Я собираюсь рассказать о двух сервисах — TinyPNG и reSmush.it, которые предоставляют API для сжатия изображений на лету. Посмотрим на них одного за другим.

Сжимайте изображения с помощью TinyPNG в Laravel

Чтобы сжимать изображения с помощью TinyPNG API, вам необходимо получить ключ API. Процесс прост. Зарегистрируйте у них свой адрес электронной почты, и они пришлют вам ключ разработчика.

Получив ключ API, добавьте его в .envфайл.

После этого установите пакет TinyPNG с помощью команды:

composer require tinify/tinify

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

Напишите код сжатия сразу под строкой, которая загружает изображение.

//Compress Image Code Here $filepath = public_path('storage/profile_images/'.$filenametostore);   try {     TinifysetKey(env("TINIFY_API_KEY"));     $source = TinifyfromFile($filepath);     $source->toFile($filepath); } catch(TinifyAccountException $e) {     // Verify your API key and account limit.     return redirect('ROUTE_HERE')->with('error', $e->getMessage()); } catch(TinifyClientException $e) {     // Check your source image and request options.     return redirect('ROUTE_HERE')->with('error', $e->getMessage()); } catch(TinifyServerException $e) {     // Temporary issue with the Tinify API.     return redirect('ROUTE_HERE')->with('error', $e->getMessage()); } catch(TinifyConnectionException $e) {     // A network connection error occurred.     return redirect('ROUTE_HERE')->with('error', $e->getMessage()); } catch(Exception $e) {     // Something else went wrong, unrelated to the Tinify API.     return redirect('ROUTE_HERE')->with('error', $e->getMessage()); }

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

Этот процесс выполняется в фоновом режиме. Вам не нужно беспокоиться о том, как изображение отправляется на сервер TinyPNG, как оно получает ответ API. Библиотека TinyPNG выполняет все задачи за вас.

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

Сжимайте изображения с помощью reSmush.it в Laravel

TinyPNG работает хорошо, но у него есть ограничение на оптимизацию 500 бесплатных изображений в месяц. Если вы хотите сжать более 500 изображений, вам нужно заплатить за них. В качестве альтернативы пользователи могут выбрать бесплатный сервис reSmush.it для сжатия изображений. На момент написания этой статьи reSmush.it сжимает более 7 миллиардов изображений. Этого достаточно, чтобы сказать о популярности данной услуги.

Итак, напишите код ниже, который сжимает изображения с помощью reSmush.it в Laravel.

//Compress Image Code Here $filepath = public_path('storage/profile_images/'.$filenametostore); $mime = mime_content_type($filepath); $output = new CURLFile($filepath, $mime, $filenametostore); $data = ["files" => $output];   $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://api.resmush.it/?qlty=80'); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $result = curl_exec($ch); if (curl_errno($ch)) {     $result = curl_error($ch); } curl_close ($ch);   $arr_result = json_decode($result);   // store the optimized version of the image $ch = curl_init($arr_result->dest); $fp = fopen($filepath, 'wb'); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp);

Я передал значение качества как 80 ?qlty=80в приведенном выше коде. Вы можете играть с передачей разных значений качества.

Надеюсь, вы понимаете, как загружать и сжимать изображения в Laravel. Я хотел бы услышать ваши мысли и предложения в разделе комментариев ниже.

Статьи по Теме

Источник записи: artisansweb.net

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее