Todos | Blog


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


Todos | Blog

Sobre mim

Foto do Alfredo

Alfredo Cipriani Oliveira Ribeiro, 27 anos

Formado em Engenharia da Computação

São José do Rio Preto - SP

saiba mais...

Categorias