Upload de imagens com criação de thumbnails em PHP

Artigo que aborda o processo de upload de imagens em PHP com a criação de thumbnails, que são imagens de tamanho reduzido, em diretórios separados.

[ Hits: 68.728 ]

Por: Luís Fred em 04/10/2008


Upload (copiando as imagens para seus diretórios)



upload.php

Este é o script responsável por fazer o upload propriamente dito. A função createthumbnail() será chamada aqui. Vamos ao código do script:

<?php
/*
-------------------------------------------+
| By Luís fred - [email protected]
-------------------------------------------+
*/


$path = './';
$phpExt = substr(strrchr(__FILE__, '.'), 1);

include ($path . "settings." . $phpExt);
include ($path . "func_upload." . $phpExt);

$upload_tmp = (!empty($_FILES['img']['tmp_name'])) ? $_FILES['img']['tmp_name'] : '';

if (is_uploaded_file($upload_tmp))
{

$img_types = array(".gif", ".jpg", ".jpeg", ".JPG", ".JPEG", ".png");
$img = $_FILES['img'];
$img_name = strtolower(substr($img['name'], 0, strrpos($img['name'],".")));
$img_ext = strtolower(strrchr($img['name'], "."));
$img_tmp_dest = "./temp/";
if (!preg_match("/^[-0-9A-Z_\[\]]+$/i", $img_name)) {
echo ("A imagem deve ter um nome legível");
} elseif ($img['size'] > $settings['img_max_b']) {
echo ("a imagem deve ter tamanho menor/igual a " . $settings['img_max_b'] . 'bytes');
} elseif (!in_array($img_ext, $img_types))
{
echo("são aceitos os seguintes formatos de arquivos: \n");
for($i = 0; $i < count($img_types); $i++)
{
if(count($img_types[$i]))
{
echo($img_types[$i] . ",\n\t");
}
}
} else {

$img_file = image_exists($img_tmp_dest, $img_name . $img_ext);

move_uploaded_file($upload_tmp, $img_tmp_dest . $img_file);
chmod($img_tmp_dest . $img_file, 0644);
list($width, $height, $type) = @getimagesize($img_tmp_dest . $img_file);

//$imagefile = getimagesize($img_tmp_dest . $img_file);

if ($width > $settings['photo_max_w'] || $height > $settings['photo_max_h']) {

echo ("Imagem muito grande, submeta uma imagem com resolução de no máximo 800x600");
} else {

$photo_thumb1 = image_exists($img_tmp_dest, $img_name . "_t1" . $img_ext);
createthumbnail($type, $img_tmp_dest . $img_file, $img_tmp_dest . $photo_thumb1,
$settings['thumb_w'], $settings['thumb_h'], $settings['thumb_compression']);

copy($img_tmp_dest . $photo_thumb1, "./thumbnails/" . $photo_thumb1);
copy($img_tmp_dest . $img_file, "./large/" . $img_file);
unlink($img_tmp_dest . $photo_thumb1);
unlink($img_tmp_dest . $img_file);
echo ("<script>alert('upload realizado');location='index.html';</script>");

}


}

}
else
{
echo ("<script>alert('Erro no upload');location='index.html';</script>");
}

?>

Em seguida vem o código comentado:

<?php
/**
* @author Luís Fred
* @mail [email protected]
*/


$path = './';
$phpExt = substr(strrchr(__FILE__, '.'), 1);
include ($path . "settings." . $phpExt);
include ($path . "fun_upload." . $phpExt);

$upload_tmp = (!empty($_FILES['img']['tmp_name'])) ? $_FILES['img']['tmp_name'] : '';

//Se o arquivo foi enviado ao servidor, serão feitas algumas checagens no arquivo
if (is_uploaded_file($upload_tmp))
{
//Armazena em um array, as extensões de arquivo que serão aceitas
$img_types = array(".gif", ".jpg", ".jpeg", ".JPG", ".JPEG", ".png");

//armazena na variável $img, o nome de upload do arquivo, que é img.
$img = $_FILES['img'];

/*pega o nome da imagem, pega tudo o que estiver antes do ponto ".",
*deixando a extensão de fora.
*/

$img_name = strtolower(substr($img['name'], 0, strrpos($img['name'],".")));

//pega somente a extensão do arquivo, tudo o que estiver depois do pnto
$img_ext = strtolower(strrchr($img['name'], "."));
//diretório temporário, onde a imagem ficará até ter o seu tamanho reduzido.
$img_tmp_dest = "./temp/";

//faz uma verificação no nome da imagem, que só poderá conter letras e números.
if (!preg_match("/^[-0-9A-Z_\[\]]+$/i", $img_name)) {
echo ("A imagem deve ter um nome legivel");

/*chega se o tamanho da imagem que está sendo usada no upload tem tamanho
*maior que o estabelecido previamente.
*/

} elseif ($img['size'] > $settings['img_max_b']) {
echo ("a imagem deve ter tamanho menor/igual a " . $settings['img_max_b'] . 'bytes');

/*E se o formato do arquivo que está sendo usado no upload não for um dos aceitos...*/
} elseif (!in_array($img_ext, $img_types))
{
echo("são aceitos os seguintes formatos de arquivos: \n");
for($i = 0; $i < count($img_types); $i++)
{
if(count($img_types[$i]))
{
echo($img_types[$i] . ",\n\t");
}
}
} else {

//captura a imagem que se encontra no diretório temporário que criamos.
$img_file = image_exists($img_tmp_dest, $img_name . $img_ext);

/*E então copia a imagem que está em $_FILES['img']['tmp_name'] para o nosso
*diretório temporário.
*/

move_uploaded_file($upload_tmp, $img_tmp_dest . $img_file);
/*Modifica as permissões de acesso ao arquivo.
* Escrita e leitura para o proprietário, somente leitura para todos os outros.
*/

chmod($img_tmp_dest . $img_file, 0644);

//pega a largura, a altura e o tipo de imagem que está sendo usada.
list($width, $height, $type) = @getimagesize($img_tmp_dest . $img_file);

/*Se preferir use assim:
$imagefile = getimagesize($img_tmp_dest . $img_file);
if ($imagefile[0] > $settings['photo_max_w'] || $imagefile[1] > $settings['photo_max_h']) {

echo ("Imagem muito grande, submeta uma imagem com resolução de no máximo 800x600");
}
$imagefile[0] = largura;
$imagefile[1] = altura;
$imagefile[2] = tipo;
*/



if ($width > $settings['img_max_w'] || $height > $settings['img_max_h']) {
} else {
//cria um nome diferente para a imagem menor
$img_thumb = image_exists($img_tmp_dest, $img_name . "_t1" . $img_ext);

/*Aqui é usada a função createthumbnail() que criamos anteriormente
*para gerar as imagens de tamanho menor.
*/

createthumbnail($type, $img_tmp_dest . $img_file, $img_tmp_dest . $img_thumb,
$settings['thumb_w'], $settings['thumb_h'], $settings['thumb_compression']);

/*copia a imagem, já redimensionada, para a pasta thumbnails*/
copy($img_tmp_dest . $img_thumb, "./thumbnails/" . $img_thumb);

/*copia a imagem de tamanho original para a pasta large*/
copy($img_tmp_dest . $img_file, "./large/" . $img_file);

/*apaga o conteúdo da pasta temporária que usamos durante todo o processo*/
unlink($img_tmp_dest . $img_thumb);
unlink($img_tmp_dest . $img_file);
echo ("<script>alert('upload realizado');location='index.html';</script>");

}


}

}
else
{
echo ("<script>alert('Erro no upload');location='index.html';</script>");
}

?>

Faça o download do código acima aqui.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Upload (criando o formulário)
   3. Upload (estabelecendo configurações)
   4. Upload (função para redimensionar as imagens)
   5. Upload (copiando as imagens para seus diretórios)
   6. Conclusão e referências
Outros artigos deste autor

Criando uma agenda eletrônica com PHP/MySQL

Como criar um sistema de autenticação de usuários usando PHP/MySQL

Leitura recomendada

Trabalhando com arquivos em PHP

Organizando fotos de camêra digital

PEAGLE: Serviço Web de busca indexada em seu servidor local

Gerando documentos PDF com a classe FPDF no PHP

O perigo no gerenciador de uploads do PHP

  
Comentários
[1] Comentário enviado por jolupi em 07/11/2008 - 15:09h

Excelente conjunto de artigos. Copiei para estudar e não funcionou. Ele não encontra insert_image.php que é a action do index.php. Vc já reparou ou eu estou dando mole ?

[2] Comentário enviado por fredwind em 07/11/2008 - 20:59h

é verdade jolupi, o formulario não consegue encontrar insert_image.php porque na verdade ele não existe, foi um vacilo meu. Na verdade o script que o formulario deveria procurar é upload.php, pouco antes de enviar o artigo pro site eu mudei o nome do script insert_image.php para upload.php porque achei mais conveniente e esqueci de fazer a modificação no formulario, desculpe. Qualquer duvida pode me mandar um email, é sempre um prazer ajudar!!!

[3] Comentário enviado por doc.ric em 22/01/2009 - 01:05h

Oi,

Gostei muito da tua solução, e pretendo utilizá-la em um projeto q estou desenvolvendo.
Tentei fazer funcionar o upload, mas não consigo criar as fotos jpg nas pastas "large" e "thumbnail" ... Estou usando o WampServer, com PHP 5.2.6.
Podes me mandar teu email de contato para q possa te remeter a instalação ?
Um abraço,
Ric
[email protected]

[4] Comentário enviado por driseven em 05/02/2009 - 10:21h

amigos,


qdo tente anexar uma imagem, ocorreu o seguinte erro:

Warning: main(./fun_upload.php) [function.main]: failed to open stream: No such file or directory in /home/quintalf/public_html/teste/upload.php on line 6

Warning: main(./fun_upload.php) [function.main]: failed to open stream: No such file or directory in /home/quintalf/public_html/teste/upload.php on line 6

Warning: main(./fun_upload.php) [function.main]: failed to open stream: No such file or directory in /home/quintalf/public_html/teste/upload.php on line 6

Warning: main() [function.include]: Failed opening './fun_upload.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/quintalf/public_html/teste/upload.php on line 6
A imagem deve ter um nome legivel


alguém poderia me dizer o pq?

[5] Comentário enviado por scavenger em 09/03/2009 - 09:22h

Driseven,

Altere a linha:

include ($path . "fun_upload." . $phpExt);

para:

include ($path . "func_upload." . $phpExt);

do arquivo upload.php

Até mais,

Rodrigo Spillere

[6] Comentário enviado por amj233 em 06/04/2009 - 17:02h

Muito bom!!!

Se houver duas imagens com nomes iguais o sistema substitui a anterior pela nova, não é?.
Me corrijam se estiver errado!!!

[7] Comentário enviado por henbran em 18/02/2010 - 10:42h

BOM DIA.
PORVENTURA HÁ COMO CARREGAR OS BIT's DA IMAGEM, UTILIZANDO RECURSOS HTML/JAVASCRIPT, AO INVÉS DO ARQUIVO EM SI?
MEU PROVEDOR (localweb) TEM RESTRIÇÕES DE USUÁRIO, SERIA MAIS TRABALHOSO CONCEDER DIREITOS A UM DETERMINADO USUÁRIO EM CARREGAR IMAGENS.
O QUE PRECISO NA VERDADE É INSERIR A IMAGEM NO BANCO DE DADOS E NÃO GUARDÁ-LA NO SERVIDOR EM FORMA DE ARQUIVO.
OBRIGADO.

[8] Comentário enviado por fredwind em 19/02/2010 - 09:02h

Caro herban, eu creio que esta solução não seja possivel ou pelo menos ainda nao tenho visto algo assim em trabalhos com MySQL, é preciso que as imagens fiquem em diretorios especificos e seus nomes e/ou paths no banco de dados. Obrigado pelo comentário. Qualquer coisa é so da o toque!!

[9] Comentário enviado por Luiz Araujo em 23/02/2010 - 17:41h

Windboy,

Obrigado pelo código.


No formulário do arquivo principal, que deve se chamar index.html (location chamado pelo upload.php) o action ainda está apontando para "./insert_image.php" ao invés de "upload.php".

No link para o código fonte do upload.php:
(http://www.vivaolinux.com.br/imagens/artigos/comunidade/upload.php.txt_
Na linha 10, houve um erro de digitação. O código correto é:
include ($path . "func_upload." . $phpExt);

[]s,


Contribuir com comentário