Upload e thumbnail de imagem com PHP
Publicado em 28/11/2007 15:49
Categorias:
Segue um script para fazer um Upload de Imagem por formulário, redimencionamento e criação de thumbnail com PHP.
Primeiro vamos criar o formulário:
1 <form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post" 2 enctype="multipart/form-data" > 3 4 <label for="FILE">ARQUIVO</label> 5 <input type="file" name="FILE" id="FILE" /> 6 <br /> 7 <input type="submit" value="enviar"> 8 </form>
A propriedade enctype="multipart/form-data" na tag form responsável por falar para o formulário que ele esta enviando um arquivo binário, sem isso não é possível enviar nenhum tipo de arquivo.
E a tag <input type="file" name="FILE" id="FILE" /> é responsável por você poder selecionar o arquivo que deseja, nada de complicado.
Segundo, agora que já temos o arquivo transmitido, vamos recebe-lo com o PHP, note que o action do formulário é ele mesmo($_SERVER["PHP_SELF"]), portanto continuamos trabalhando no mesmo arquivo PHP:
1 <?php 2 # Jogo o arquivo em uma variavel 3 $file = $_FILES["FILE"]; 4 5 # verifico o tamanho do arquivo para evitar ataques 6 if($file && $file["size"] < 500000){ 7 # verifico se houve algum erro 8 if ($file["error"] > 0) { 9 echo "Erro: " . $file["error"] . "<br />"; 10 } else { 11 # se não tiver erros chamo a funcao para redimencionar 12 # e armazenar a imagem transmitida 13 14 # esta chamada cria um thumb de 100px de largura 15 create_thumb($file["tmp_name"], $file["type"], 16 "thumbs/" . $file["name"], 100); 17 18 # esta chamada cria uma copia com o tamanho 19 # de 450px de largura 20 create_thumb($file["tmp_name"], $file["type"], 21 "images/" . $file["name"], 450); 22 23 print_r($file); 24 print "Upload success!"; 25 exit; 26 } 27 } 28 ?>
Note que utilizo a variável $_FILES[] do PHP para receber o arquivo, esta variável é um array que descreve algumas propriedades do arquivo enviado, são elas:
1 Array ( [name] => imagen.png 2 [type] => image/png 3 [tmp_name] => /tmp/phphQovVs 4 [error] => 0 5 [size] => 322348 )
Usei algumas dessas propriedade para passar a minha função de tratamento create_thumb, que vamos ver como funciona agora:
1 function create_thumb($name,$mime_type,$filename,$new_w){ 2 3 # criando imagem temporaria 4 if(preg_match("/^image\/png$/", $mime_type)) { 5 $tmp_img = imagecreatefrompng($name); 6 } else if(preg_match("/^image\/jpe?g$/", $mime_type)){ 7 $tmp_img = imagecreatefromjpeg($name); 8 }else if(preg_match("/^image\/gif$/", $mime_type)){ 9 $tmp_img = imagecreatefromgif($name); 10 }else{ 11 return false; 12 } 13 14 # verificando dimensoes da imagem 15 $old_x = imagesx($tmp_img); 16 $old_y = imagesy($tmp_img); 17 18 # ajustando dimensoes do thumbnail 19 $thumb_w = $new_w; 20 $thumb_h = floor( $new_w * ( $old_y / $old_x ) ); 21 22 #criando nova imagem temporaria com as dimensoes novas 23 $new_img = imagecreatetruecolor($thumb_w,$thumb_h); 24 25 #copiando e redimencionamdo a imagem para o thumbnail 26 imagecopyresampled($new_img, $tmp_img, 0,0,0,0, $thumb_w, 27 $thumb_h, $old_x, $old_y); 28 29 # salvando imagem para o arquivo 30 if(preg_match("/^image\/png$/", $mime_type)){ 31 imagepng($new_img,$filename); 32 } else if(preg_match("/^image\/jpe?g$/", $mime_type)){ 33 imagejpeg($new_img,$filename); 34 } else if(preg_match("/^image\/gif$/", $mime_type)){ 35 imagegif($new_img,$filename); 36 } 37 38 # destruindo imagens temporarias para liberar memoria 39 imagedestroy($new_img); 40 imagedestroy($tmp_img); 41 }
A função acima está bem comentada, a única observação fica para a verificação do tipo da imagem, que é necessário para criar as novas imagens da forma correta.
Você poderia criar thumbnails para imagens de uma pasta inteira, ou criar várias imagens de tamanhos diferentes com esta função.
Num próximo post, explicarei como fazer o upload e tratamento de várias imagens simultaneamente, espero que este tenha sido útil.
Abraço, T+
Alfredo Ribeiro




