Transferir Arquivos em PHP e Gerar Miniaturas de Imagens
Começando a série de artigos em PHP, neste artigo vamos falar de uma funcionalidade que iremos precisar no nosso sistema de locadora de DVD que é transferir arquivos da máquina local para o servidor web. Por que utilizaremos isto? Na tabela cliente temos um campo para armazenar a foto do cliente para facilitar o seu reconhecimento num atendimento telefônico. Neste artigo pressupõe que você tenha algum conhecimento de HTML e noções básicas do PHP.
Primeiro vamos verificar os requisitos uma pasta que possua permissão de escrita e o tamanho dos arquivos que podemos enviar para o servidor. No primeiro requisito, dentro do sistema operacional Windows XP basta clicar com o botão direito do mouse em cima da pasta e no “menu de contexto” e clicar em “propriedades” com o botão esquerdo do mouse. Verifique se o atributo “read-only” ou “somente leitura” está desmarcado, conforme a imagem:
Dentro de um ambiente Linux, você pode utilizar o comando “chmod” e deve setar o atributo da pasta na permissão 755 ou 757 ou 777. Recomendo a primeira opção. Para entender o significado sugiro que leia o artigo: chmod no Wikipédia. Caso você não tenha acesso ao Linux você pode fazer isto via FTP em alguns casos. No “Filezilla” basta clicar com o botão direito do mouse na pasta desejada no “menu de contexto” clicar na opção “File permissions”, nos campos “numeric value” atribua o valor 755 e caso seja do seu gosto estenda as configuração para as demais pastas e arquivos que estão localizados dentro da pasta. Veja as imagens abaixo retiradas do “Filezilla”:

Menu de contexto no FileZilla
e

Permissões no FileZilla
Após esta configuração vamos analisar o segundo requisito a limitação do servidor. Neste caso vamos criar um arquivo php chamado “index.php” e salvar o arquivo na pasta do upload dentro do arquivo deverá conter o seguinte código:
echo phpinfo();
Acesse o endereço no navegador de sua preferência e procure a propriedade de acordo com a imagem abaixo:
A propriedade é “upload_max_filesize”, geralmente ele é configurado de acordo com a restrição do hardware do seu servidor ou políticas comerciais. No exemplo acima nossa restrição é de 64 MB, mas geralmente em hosts compartilhados esta restrição é de: 2MB. Para termos um bom código é necessário validar esta situação.
Após a validação dos requisitos estamos pronto para desenvolver nosso código. O primeiro código é o HTML para envio do arquivo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Upload de Arquivo</title> </head> <body> <p>Somente fotos com a extensão .jpg no tamanho máximo de 64 MB: </p> <form method="post" action="upload.php" enctype="multipart/form-data"> <label>Fotos</label> <input type="file" name="foto" id="foto" /> <input type="submit" value="Enviar" /> </form> </body> </html>
O mais importante neste código estão na linha 9 e linha 11. Na linha 9 precisamos estar atentos a propriedade “enctype=”multipart/form-data”” porque ela indica que este formulário permite o envio de arquivos de dados, sem esta propriedade o código não funciona, além disto o método de envio será o “POST” indicado na propriedade “method” a outra opção será o “GET” para entender o significado visite HypertText Transfer Protocol no Wikipedia e será enviado para o arquivo “upload.php” indicado na propriedade “action”. Na linha 11 temos o nome do campo que conterá os dados do arquivo dentro da propriedade “name”, na linguagem de programação PHP deveremos procurar por “foto”. Uma dica importante todo objeto do formulário HTML deve possui a propriedade “name”, pois esta propriedade permite a identificação do objeto na linguagem de programação. Lembre – se “colocou um filho no mundo coloque nome nele”.
Nosso próximo passo é criar o arquivo “upload.php” para facilitar o entendimento vou deixar o código comentado.
<?php
/*** Inicializando as variaveis ***/
$strMensagem = "";
$arrConfig = array();
/*** Recebe os arquivos do formulario ***/
$fileFoto = $_FILES;
/*** Criando um array com as configurações necessárias ***/
// Pasta onde o arquivo vai ser salvo
$arrConfig['pasta'] = '';
$arrConfig['tamanho_mb'] = 64;
// A unidade de medida é em bytes neste caso para transformar 64 MB para 64 Bytes basta fazer a conta abaixo.
$arrConfig['tamanho_bytes'] = (1024 * 1024) * $strConfig['tamanho_bytes'];
// Validando a extensão
$arrConfig['extensoes'] = array('jpg');
// Mensagens de erro amigaveis para o usuario.
$arrConfig['erros'] = array('Sucesso.','O arquivo é maior que o permitido: '.$arrConfig['tamanho_mb'].'MB','O arquivo ultrapassa o limite.','O upload do arquivo foi feito parcialmente. Provavel erro na rede.','Erro na transferência do arquivo');
// Existe mensagem de erro na transferencia do arquivo para a pasta temporaria do servidor? Caso positivo montamos a mensagem de erro
if ($fileFoto['foto']['error'] != 0)
{
$strMensagem = ("Não foi possível fazer o upload, erro:<br />" . $arrConfig['erros'][$fileFoto['foto']['error']])."<br /> Informe o administrador do sistema.";
}
else if (array_search(strtolower(end(explode('.', $fileFoto['foto']['name']))), $arrConfig['extensoes']) === false) //Valida as extensões do arquivo.
{
$strMensagem = "Por favor, envie apenas imagem com a extensão .jpg.";
}
else if ($arrConfig['tamanho_bytes'] > $fileFoto['foto']['size'])
{
$strMensagem = "Ultapassou o limite. O arquivo deve conter no máximo:".$arrConfig['tamanho_mb']." MB";
}
else
{
/****
Após validar todas as situações movemos para o arquivo da pasta temporária para a pasta de destino
Não precisa de validação utilize apenas o código abaixo.
- O move_uploaded_file É uma função do PHP que move arquivos da pasta temporária para a pasta de destino.
ATENCAO: Caso exista um arquivo com o nome esta função ira sobrescrever o arquivo.
****/
if (move_uploaded_file($fileFoto['foto']['tmp_name'], $arrConfig['pasta'] . $fileFoto['foto']["name"]))
{
/*** Gerando a miniatura *****/
//O primeiro passo é gerar uma cópia do original para isto é necessário pegar a largura e altura.
list($intLargura, $intAltura) = getimagesize($arrConfig['pasta'] . $fileFoto['foto']["name"]);
//Setando altura e largura da miniatura
$intAlturaMin = 80;
$intLarguraMin = 80;
//Criando um arquivo de imagem em branco com os parametros de largura x altura. A unidade de medida é em pixels.
$binThumb = imagecreatetruecolor($intAlturaMin, $intLarguraMin);
//Transformando a imagem em binário para fazer o recorte e gerar a miniatura.
$binImagem = imagecreatefromjpeg($arrConfig['pasta'] . $fileFoto['foto']["name"]);
//**** Gerando o thumb e deixando na memoria do servidor ****/
imagecopyresampled($binThumb, $binImagem, 0, 0, 0, 0, $intLarguraMin, $intAlturaMin, $intLargura, $intAltura);
//Salvando a imagem em disco e definindo a qualidade do thumb. Os parametros sao: imagem, diretorio e nome do arquivo(O local de destino deve possuir permissão de escrita), [qualidade]
imagejpeg($binThumb, "peq_". $fileFoto['foto']["name"], 50);
//Retirando o objeto da memoria
imagedestroy($binThumb);
// Upload efetuado com sucesso, exibe o resultado e as duas imagens.
$strMensagem = "Upload efetuado com sucesso! <br />
<p>A imagem enviada:</p>
<img src='".$arrConfig['pasta'] . $fileFoto['foto']["name"] ."' border='0' title='Imagem Original'>
<p>Thumb</p>
<img src='".$arrConfig['pasta'] . "peq_". $fileFoto['foto']["name"] ."' border='0' title='Imagem Menor gerada pelo sistema'>
";
}
else
{
// Não foi possível fazer o upload, provavelmente a pasta está incorreta
$strMensagem = "Não foi possível enviar o arquivo, tente novamente";
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Resultado do Upload</title>
</head>
<body>
<h1>Resultado</h1>
<?php
echo $strMensagem;
?> <br /><br />
<a href="form.php" title="Enviar mais arquivos">Enviar mais arquivos</a>
</body>
</html>
As funções chaves deste artigo são a “move_uploaded_file” para maiores detalhes visualize o link no manual oficial http://br.php.net/manual/pt_BR/function.move-uploaded-file.php. Esta função retorna um valor booleano (Verdadeiro ou falso – foi utilizando dentro de um IF no nosso exemplo na linha 43), além da transferência do arquivo da pasta temporária para o local de destino esta função valida a existência do arquivo, deve ficar atento por que esta função sobrescreve arquivos existentes. A “imagecopyresampled” é outra função essencial, retorna um valor booleano e serve para gerar arquivos em outras dimensões ou recortes na imagem de acordo com os parâmetros que são passados para ela. Para as coordenadas utilize o plano cartesiano como referência. Para maiores informações veja o link no manual oficial: http://br.php.net/manual/pt_BR/function.imagecopyresampled.php . Fiz a tradução dos devidos parâmetros:
bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
dst_image => Arquivo de destino da imagem esta na memória do servidor.
src_image => Arquivo de origem da imagem esta na memória do servidor.
dst_x => Coordenada X no arquivo de destino.
dst_y => Coordenada Y no arquivo de destino.
src_y => Coordenada X no arquivo de origem.
src_y => Coordenada Y no arquivo de origem.
dst_w => Largura da imagem no arquivo de destino.(pixel)
dst_h => Altura da imagem no arquivo de destino.(pixel)
src_w =>Largura da imagem no arquivo de origem.(pixel)
src_h =>Altura da imagem no arquivo de origem.(pixel)
Faça o registro e baixe aqui o código deste artigo:
Upload e Geração de Miniatura em PHP (2,5 KiB)
Você não tem permissão de fazer download.
Bom vídeo.
Link para o vídeo: http://blip.tv/file/3876738
| Imprimir artigo | Este artigo foi escrito por Eder Frances em 13 de julho de 2010 às 14:23, e está arquivado em PHP. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |



