Olá pessoal, desculpem pela ausência, mas é que eu estou trabalhando em alguns projetos e o tempo está curto. Hoje nesse artigo vou mostrar como fazer um upload de uma imagem para o servidor e também gravar isso no banco de dados.
Vou utilizar como exemplo um mini-portal, onde o usuário irá se cadastrar e escolher sua foto de exibição. Então, vamos lá.
1. Banco de dados
Vamos criar nossa tabela de usuários:
CREATE TABLE `usuarios` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `nome` VARCHAR( 50 ) NOT NULL , `email` VARCHAR( 50 ) NOT NULL , `foto` VARCHAR( 100 ) NOT NULL ) ENGINE = MYISAM ;
2. Formulário de cadastro
Agora vamos desenhar nosso formulário e apontar a action para o mesmo arquivo:
IMPORTANTE: nunca se esqueça que quando se trata de arquivos, precisamos adicionar ao nosso form a seguinte propriedade: enctype=”multipart/form-data”
<!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>Cadastro de usuário</title> </head> <body> <h1>Cadastro de Usuário</h1> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data" name="cadastro" > Nome:<br /> <input type="text" name="nome" /><br /><br /> Email:<br /> <input type="text" name="email" /><br /><br /> Foto de exibição:<br /> <input type="file" name="foto" /><br /><br /> <input type="submit" name="cadastrar" value="Cadastrar" /> </form> </body> </html>
3. Cadastrando Usuário
Como a action está apontando para o próprio arquivo, nosso código vai nele mesmo:
<?php
// Conexão com o banco de dados
$conn = @mysql_connect("localhost", "usuario", "senha") or die ("Problemas na conexão.");
$db = @mysql_select_db("banco", $conn) or die ("Problemas na conexão");
// Se o usuário clicou no botão cadastrar efetua as ações
if (isset($_POST['cadastrar'])) {
// Recupera os dados dos campos
$nome = $_POST['nome'];
$email = $_POST['email'];
$foto = $_FILES["foto"];
// Se a foto estiver sido selecionada
if (!empty($foto["name"])) {
// Largura máxima em pixels
$largura = 150;
// Altura máxima em pixels
$altura = 180;
// Tamanho máximo do arquivo em bytes
$tamanho = 1000;
$error = array();
// Verifica se o arquivo é uma imagem
if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto["type"])){
$error[1] = "Isso não é uma imagem.";
}
// Pega as dimensões da imagem
$dimensoes = getimagesize($foto["tmp_name"]);
// Verifica se a largura da imagem é maior que a largura permitida
if($dimensoes[0] > $largura) {
$error[2] = "A largura da imagem não deve ultrapassar ".$largura." pixels";
}
// Verifica se a altura da imagem é maior que a altura permitida
if($dimensoes[1] > $altura) {
$error[3] = "Altura da imagem não deve ultrapassar ".$altura." pixels";
}
// Verifica se o tamanho da imagem é maior que o tamanho permitido
if($foto["size"] > $tamanho) {
$error[4] = "A imagem deve ter no máximo ".$tamanho." bytes";
}
// Se não houver nenhum erro
if (count($error) == 0) {
// Pega extensão da imagem
preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $foto["name"], $ext);
// Gera um nome único para a imagem
$nome_imagem = md5(uniqid(time())) . "." . $ext[1];
// Caminho de onde ficará a imagem
$caminho_imagem = "fotos/" . $nome_imagem;
// Faz o upload da imagem para seu respectivo caminho
move_uploaded_file($foto["tmp_name"], $caminho_imagem);
// Insere os dados no banco
$sql = mysql_query("INSERT INTO usuarios VALUES ('', '".$nome."', '".$email."', '".$nome_imagem."')");
// Se os dados forem inseridos com sucesso
if ($sql){
echo "Você foi cadastrado com sucesso.";
}
}
// Se houver mensagens de erro, exibe-as
if (count($error) != 0) {
foreach ($error as $erro) {
echo $erro . "<br />";
}
}
}
}
?>
Resumindo, nós pegamos a imagem enviada, verificamos se ela está dentro dos limites permitidos, depois jogamos essa foto na pasta fotos/ do servidor e na tabela de usuários do banco de dados adicionamos as informações do usuário juntamente com o nome da foto.
OBS: não esqueça de dar pemissão de gravar na pasta onde serão gravadas as fotos.
4. Exibindo a imagem
Agora é simples. Vamos supor que queremos exibir as informações de todos os usuários, incluindo a foto:
<?php
// Seleciona todos os usuários
$sql = mysql_query("SELECT * FROM usuarios ORDER BY nome");
// Exibe as informações de cada usuário
while ($usuario = mysql_fetch_object($sql)) {
// Exibimos a foto
echo "<img src='fotos/".$usuario->foto."' alt='Foto de exibição' /><br />";
// Exibimos o nome e email
echo "<b>Nome:</b> " . $usuario->nome . "<br />";
echo "<b>Email:</b> " . $usuario->email . "<br /><br />";
}
?>
5. Excluindo imagem
E se for necessário excluir um usuário? Simples, utilizamos o comando delete e tudo certo, porém a foto dele vai continuar lá na pasta fotos/ do nosso servidor. A solução é simples, utilizamos a função unlink(). Vamos supor que queremos remover o usuário de ID = 1 e sua respectiva foto:
<?php
// ID de exemplo
$id = 1;
// Selecionando nome da foto do usuário
$sql = mysql_query("SELECT foto FROM usuarios WHERE id = '".$id."'");
$usuario = mysql_fetch_object($sql);
// Removendo usuário do banco de dados
$sql = mysql_query("DELETE FROM usuarios WHERE id = '".$id."'");
// Removendo imagem da pasta fotos/
unlink("fotos/".$usuario->foto."");
?>
6. Conclusão
Podemos concluir que é muito simples fazer upload de uma imagem para o servidor, e não só apenas imagem, poderia ser qualquer outro arquivo, só mudaria o modo de validação. Espero que vocês tenham entendido, até o próximo artigo. Abraços.