{"id":28030,"date":"2021-05-31T15:37:00","date_gmt":"2021-05-31T12:37:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28030"},"modified":"2021-10-18T04:05:42","modified_gmt":"2021-10-18T01:05:42","slug":"como-fazer-upload-e-compactar-imagens-no-laravel","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pt-pt\/como-fazer-upload-e-compactar-imagens-no-laravel\/","title":{"rendered":"Como fazer upload e compactar imagens no Laravel"},"content":{"rendered":"<p>Voc\u00ea est\u00e1 procurando como fazer upload e compactar imagens no Laravel? O Laravel oferece uma maneira f\u00e1cil de enviar arquivos. E compactar as imagens no momento do upload \u00e9 uma boa pr\u00e1tica. Neste artigo, mostro como fazer upload e compactar imagens no Laravel.<\/p>\n<h3>Por que precisa compactar imagens?<\/h3>\n<p>As imagens desempenham um papel importante no seu site. As imagens adicionam uma melhor experi\u00eancia do usu\u00e1rio e uma experi\u00eancia atraente para os visitantes. Mas, ao mesmo tempo, tamb\u00e9m pode prejudicar o desempenho do site. Imagens pesadas tornam o site lento. Como resultado, seu site demora muito para carregar. Os usu\u00e1rios n\u00e3o gostam de sites lentos. Se o seu site demorar mais para carregar, h\u00e1 uma grande chance de voc\u00ea perder seu p\u00fablico. O tempo de carregamento padr\u00e3o de um site \u00e9 de 2 segundos. Voc\u00ea deve cuidar para que seu site carregue em 2 segundos.<\/p>\n<p>Embora haja v\u00e1rios fatores que precisam ser levados em considera\u00e7\u00e3o para melhorar a velocidade da p\u00e1gina, um deles \u00e9 o uso de imagens otimizadas. A compacta\u00e7\u00e3o de imagens reduz o tamanho da imagem original sem perder sua qualidade. Isso ajuda a aumentar a velocidade do site.<\/p>\n<p>Dito isso, vamos ver como fazer upload e compactar imagens no Laravel.<\/p>\n<h3>Carregando imagens no Laravel<\/h3>\n<p>O Laravel oferece uma maneira limpa de enviar as imagens. Para come\u00e7ar, primeiro precisamos criar um diret\u00f3rio onde armazenaremos as imagens. Abra seu prompt de comando no diret\u00f3rio raiz e execute o comando abaixo.<\/p>\n<pre><code>php artisan storage:link<\/code><\/pre>\n<p>Este comando cria um diret\u00f3rio de &#8216;armazenamento&#8217; na pasta &#8216;p\u00fablica&#8217;.<\/p>\n<p>Em seguida, crie um formul\u00e1rio com o bot\u00e3o de entrada e envio do arquivo, adicionando o c\u00f3digo abaixo em seu arquivo blade.<\/p>\n<pre><code>&lt;form action=\"{{ url('ROUTE_HERE') }}\" method=\"post\" enctype=\"multipart\/form-data\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-group\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label for=\"exampleInputFile\"&gt;File input&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"file\" name=\"profile_image\" id=\"exampleInputFile\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0{{ csrf_field() }}\n\u00a0\u00a0\u00a0\u00a0&lt;button type=\"submit\" class=\"btn btn-default\"&gt;Submit&lt;\/button&gt;\n&lt;\/form&gt;<\/code><\/pre>\n<p>No HTML acima, adicionei uma entrada de arquivo com o nome &#8216;profile_image&#8217;. Eu tamb\u00e9m adicionei o <code>{{ csrf_field() }}<\/code>que \u00e9 necess\u00e1rio para enviar formul\u00e1rios do Laravel.<\/p>\n<p>Agora, supondo que voc\u00ea envie a solicita\u00e7\u00e3o de postagem para o <code>store()<\/code>m\u00e9todo do seu controlador, escreva um c\u00f3digo que armazene a imagem no servidor conforme abaixo.<\/p>\n<pre><code>public function store(Request $request)\n{\n\u00a0\u00a0\u00a0\u00a0if($request-&gt;hasFile('profile_image')) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get filename with extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filenamewithextension = $request-&gt;file('profile_image')-&gt;getClientOriginalName();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get filename without extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get file extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$extension = $request-&gt;file('profile_image')-&gt;getClientOriginalExtension();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/filename to store\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filenametostore = $filename.'_'.time().'.'.$extension;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Upload File\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$request-&gt;file('profile_image')-&gt;storeAs('public\/profile_images', $filenametostore);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Compress Image Code Here\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return redirect('ROUTE_HERE')-&gt;with('success', \"Image uploaded successfully.\");\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Este c\u00f3digo cria um nome de arquivo \u00fanico e armazena o arquivo dentro do diret\u00f3rio &#8216;profile_images&#8217;. O Laravel gera automaticamente um diret\u00f3rio &#8216;profile_images&#8217; sob &#8216;public \/ storage&#8217; se ele n\u00e3o existir.<\/p>\n<p>Como dito antes, \u00e9 uma pr\u00e1tica melhor otimizar a imagem no momento do upload. Terminamos com o c\u00f3digo de upload de uma imagem. Agora precisamos compact\u00e1-lo. Vou cobrir 2 servi\u00e7os &#8211; <a href=\"https:\/\/tinypng.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">TinyPNG<\/a> e <a href=\"https:\/\/resmush.it\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">reSmush.it<\/a> que fornece as APIs para compactar imagens em tempo real. Vamos v\u00ea-los um por um.<\/p>\n<h3>Comprimir imagens usando o TinyPNG no Laravel<\/h3>\n<p>Para compactar imagens usando a API TinyPNG, voc\u00ea precisa obter sua <a href=\"https:\/\/tinypng.com\/developers\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">chave de API<\/a>. O processo \u00e9 direto. Registre seu endere\u00e7o de e-mail com eles e eles enviar\u00e3o sua chave de desenvolvedor.<\/p>\n<p>Depois de obter a chave API, adicione-a ao <code>.env<\/code>arquivo.<\/p>\n<p>Depois disso, instale um pacote TinyPNG usando o comando:<\/p>\n<pre><code>composer require tinify\/tinify<\/code><\/pre>\n<p>Ap\u00f3s a instala\u00e7\u00e3o do pacote, temos que escrever um c\u00f3digo que compacta a imagem carregada usando o TinyPNG.<\/p>\n<p>Escreva um c\u00f3digo de compress\u00e3o logo abaixo da linha que carrega a imagem.<\/p>\n<pre><code>\/\/Compress Image Code Here\n$filepath = public_path('storage\/profile_images\/'.$filenametostore);\n\u00a0\ntry {\n\u00a0\u00a0\u00a0\u00a0TinifysetKey(env(\"TINIFY_API_KEY\"));\n\u00a0\u00a0\u00a0\u00a0$source = TinifyfromFile($filepath);\n\u00a0\u00a0\u00a0\u00a0$source-&gt;toFile($filepath);\n} catch(TinifyAccountException $e) {\n\u00a0\u00a0\u00a0\u00a0\/\/ Verify your API key and account limit.\n\u00a0\u00a0\u00a0\u00a0return redirect('ROUTE_HERE')-&gt;with('error', $e-&gt;getMessage());\n} catch(TinifyClientException $e) {\n\u00a0\u00a0\u00a0\u00a0\/\/ Check your source image and request options.\n\u00a0\u00a0\u00a0\u00a0return redirect('ROUTE_HERE')-&gt;with('error', $e-&gt;getMessage());\n} catch(TinifyServerException $e) {\n\u00a0\u00a0\u00a0\u00a0\/\/ Temporary issue with the Tinify API.\n\u00a0\u00a0\u00a0\u00a0return redirect('ROUTE_HERE')-&gt;with('error', $e-&gt;getMessage());\n} catch(TinifyConnectionException $e) {\n\u00a0\u00a0\u00a0\u00a0\/\/ A network connection error occurred.\n\u00a0\u00a0\u00a0\u00a0return redirect('ROUTE_HERE')-&gt;with('error', $e-&gt;getMessage());\n} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0\/\/ Something else went wrong, unrelated to the Tinify API.\n\u00a0\u00a0\u00a0\u00a0return redirect('ROUTE_HERE')-&gt;with('error', $e-&gt;getMessage());\n}<\/code><\/pre>\n<p>O c\u00f3digo acima pega uma imagem do diret\u00f3rio carregado, a envia ao servidor TinyPNG para compacta\u00e7\u00e3o e, ap\u00f3s receber uma resposta, armazena a imagem compactada no mesmo diret\u00f3rio.<\/p>\n<p>Este processo \u00e9 executado em segundo plano. Voc\u00ea n\u00e3o precisa se preocupar em como a imagem est\u00e1 indo para o servidor TinyPNG, como ele recebe a resposta da API. A biblioteca TinyPNG faz todas as tarefas para voc\u00ea.<\/p>\n<p>Tente fazer o upload da imagem agora e voc\u00ea dever\u00e1 ver sua imagem sendo compactada.<\/p>\n<h3>Comprimir imagens usando reSmush.it no Laravel<\/h3>\n<p>O TinyPNG funciona bem, mas tem uma limita\u00e7\u00e3o de otimizar 500 imagens gratuitas por m\u00eas. Se voc\u00ea deseja compactar mais de 500 imagens, \u00e9 necess\u00e1rio pagar por elas. Como alternativa, os usu\u00e1rios podem escolher um servi\u00e7o gratuito de reSmush.it para compacta\u00e7\u00e3o de imagens. No momento em que este artigo foi escrito, reSmush.it compactava mais de 7 bilh\u00f5es de imagens. Isso \u00e9 o suficiente para dizer sobre a popularidade deste servi\u00e7o.<\/p>\n<p>Ent\u00e3o, escreva o c\u00f3digo abaixo que compacta as imagens usando reSmush.it no Laravel.<\/p>\n<pre><code>\/\/Compress Image Code Here\n$filepath = public_path('storage\/profile_images\/'.$filenametostore);\n$mime = mime_content_type($filepath);\n$output = new CURLFile($filepath, $mime, $filenametostore);\n$data = [\"files\" =&gt; $output];\n\u00a0\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, 'http:\/\/api.resmush.it\/?qlty=80');\ncurl_setopt($ch, CURLOPT_POST,1);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $data);\n$result = curl_exec($ch);\nif (curl_errno($ch)) {\n\u00a0\u00a0\u00a0\u00a0$result = curl_error($ch);\n}\ncurl_close ($ch);\n\u00a0\n$arr_result = json_decode($result);\n\u00a0\n\/\/ store the optimized version of the image\n$ch = curl_init($arr_result-&gt;dest);\n$fp = fopen($filepath, 'wb');\ncurl_setopt($ch, CURLOPT_FILE, $fp);\ncurl_setopt($ch, CURLOPT_HEADER, 0);\ncurl_exec($ch);\ncurl_close($ch);\nfclose($fp);<\/code><\/pre>\n<p>Passei o valor de qualidade como 80 <code>?qlty=80<\/code>no c\u00f3digo acima. Voc\u00ea pode jogar com a passagem de diferentes valores de qualidade.<\/p>\n<p>Espero que voc\u00ea entenda como fazer upload e compactar imagens no Laravel. Eu gostaria de ouvir seus pensamentos e sugest\u00f5es na se\u00e7\u00e3o de coment\u00e1rios abaixo.<\/p>\n<h4>Artigos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/tinypng-compactar-imagens-usando-php\/\" title=\"TinyPNG compactar imagens usando PHP\">TinyPNG compactar imagens usando PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/otimizacao-de-imagens-usando-o-pacote-artisansweb-image-otimizer\/\" title=\"Otimiza\u00e7\u00e3o de imagens usando o pacote artisansweb \/ image-otimizer\">Otimiza\u00e7\u00e3o de imagens usando o pacote artisansweb \/ image-otimizer<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/redimensionar-imagem-em-php-usando-a-biblioteca-de-imagens-de-intervencao\/\" title=\"Redimensionar imagem em PHP usando a biblioteca de imagens de interven\u00e7\u00e3o\">Redimensionar imagem em PHP usando a biblioteca de imagens de interven\u00e7\u00e3o<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos estudar como fazer upload e compactar imagens no Laravel. Usamos a biblioteca TinyPNG para compactar as imagens carregadas. Desta forma, podemos melhorar<\/p>\n","protected":false},"author":1,"featured_media":21621,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[210,502],"tags":[848],"class_list":["post-28030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elementor-9","category-laravel","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/comments?post=28030"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28030\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media\/21621"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media?parent=28030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/categories?post=28030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/tags?post=28030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}