Olá a todos, continuando os tutoriais com PHP hoje veremos como guardar imagens em nosso sistema e recupera-las quando necessário.
A ideia é o seguinte, na tabela paginas iremos guardar alguns dados da imagem e o id do usuário proprietário desta imagem e o arquivo da imagem iremos armazena-lo em um diretório.
Obs: O nome da tabela é paginas porque faz parte de um projeto onde pretendo gravar as paginas favoritas de um usuário com uma imagem personalizada para cada página.
Agora que nossa tabela está criada vamos criar o formulário para a entrada dos dados.
<!DOCTYPE html> <html lang="pt-br"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="UTF-8"> <title>infWeb</title> </head> <body class="f2"> <div> <form enctype="multipart/form-data" action="cadPagina.php" method="post" name="cadastro_form" autocomplete="off" id="cadastro_form"> <div> <h1>Cadastrar Nova Pagina</h1> <!-- Nome --> <input name="nome" id="nome" placeholder="Nome da pagina" type="text"> <!-- Email --> <input name="url" id="url" placeholder="Endereço da pagina" type="text"> <!-- Login --> <label for="imagem">Imagem:</label> <input type="file" name="imagem"/> <!-- Castrar --> <span class="accent" style="display: block;margin-bottom: 10px;"></span> <button type="submit">Cadastrar</button> </div> </form> </div> </body> </html>
Observações:
- com o atributo enctype=”multipart/form-data”, nenhum caracteres é codificados. Este valor é necessário quando você estiver usando formulários que têm upload de arquivo.
- Os campos id_usuario, id_categoria e ordem não serão necessário neste exemplo, então vamos gravar sempre o valor 0 (zero) neles.
Agora vamos ao arquivo responsável por gravar os dados cadPagina.php
<?php //lendo os dados passados pelo formulario $nome = $_POST['nome']; $url = $_POST['url']; $ordem = $_POST['ordem']; $imagem = $_FILES["imagem"]; //Validando os dados passados if($nome == NULL) { $error[1] = "Informe um nome para pagina"; } if($url == NULL) { $error[2] = "Informe uma URL"; } if($ordem == NULL) { $ordem = 1; } // Se a imagem estiver sido selecionada if (!empty($imagem["name"])) { // Validando a imagem // Largura máxima em pixels $largura = 256; // Altura máxima em pixels $altura = 256; // Tamanho máximo do arquivo em bytes $tamanho = 100000; // Verifica se o arquivo é uma imagem $tipos = "%\.(pjpeg|jpeg|png|gif|bmp)$%i"; if(preg_match($tipos, $imagem["type"]) == 1){ $error[3] = "Arquivo selecionado não é uma imagem."; } // Pega as dimensões da imagem $dimensoes = getimagesize($imagem["tmp_name"]); // Verifica se a largura da imagem é maior que a largura permitida if($dimensoes[0] > $largura) { $error[4] = "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[5] = "Altura da imagem não deve ultrapassar ".$altura." pixels"; } // Verifica se o tamanho da imagem é maior que o tamanho permitido if($imagem["size"] > $tamanho) { $error[6] = "A imagem deve ter no máximo ".$tamanho." bytes. Ela tem: ".$imagem["size"]; } // Se não houver erros if (count($error) == 0) { //Dados do banco de dados $host = "endereco_servidor"; $username = "usuario_do_servidor"; $password = "senha_do_usuario"; $db = "nome_banco_de_dados"; // Conexão com o banco de dados $conn = @mysql_connect($host, $username, $password) or die ("Problemas na conexão."); $db = @mysql_select_db($db, $conn) or die("Problemas na conexão"); // Pega extensão da imagem preg_match("/.(gif|bmp|png|jpg|jpeg){1}$/i", $imagem["name"], $ext); // Gera um nome único para a imagem $nome_imagem = md5(uniqid(time())) . "." . $ext[1]; // Diretório de onde ficará a imagem $caminho_imagem = "imgGrid/" . $nome_imagem; // Faz o upload da imagem para seu respectivo caminho move_uploaded_file($imagem["tmp_name"], $caminho_imagem); // Insere os dados no banco $sSQL = "INSERT INTO paginas( id_usuario, id_categoria, descricao, url, ordem, img ) VALUES (0,0,'".$nome."','".$url."',1,'".$nome_imagem."')"; $sql = mysql_query($sSQL); // Se os dados forem inseridos com sucesso if($sql){ echo "Cadastrado feito com sucesso."; // Seleciona todos os usuários $sql = mysql_query("SELECT * FROM paginas"); // Exibe as informações de cada usuário while ($usuario = mysql_fetch_object($sql)) { // Exibimos a foto echo "<img src='imgGrid/".$usuario->img."' alt='Foto de exibição' /><br />"; // Exibimos o nome e email echo "<b>Nome:</b> " . $usuario->descricao . "<br />"; echo "<b>URL:</b> " . $usuario->url . "<br /><br />"; } } else{echo "Houve erro no cadastro.";} } // Se houver mensagens de erro, exibe-as if (count($error) != 0) { foreach ($error as $erro) { echo "<p>" . $erro . "</p> "; } } } ?>
No código acima depois de validarmos todos os dados a serem gravados, geramos um nome único para a imagem para que não possa coincidir com o nome de outra imagem e garantir que não haja carácter especial, que pode acabar gerando erro em algum momento.
Também apontamos o diretório imgGrid que será onde guardaremos a imagem.
// Gera um nome único para a imagem $nome_imagem = md5(uniqid(time())) . "." . $ext[1]; // Diretório de onde ficará a imagem $caminho_imagem = "imgGrid/" . $nome_imagem;
Com tudo preparado podemos realizar o upload da imagem e gravar os dados da mesma.
// Faz o upload da imagem para seu respectivo caminho move_uploaded_file($imagem["tmp_name"], $caminho_imagem); // Insere os dados no banco $sSQL = "INSERT INTO paginas( id_usuario, id_categoria, descricao, url, ordem, img ) VALUES (0,0,'".$nome."','".$url."',1,'".$nome_imagem."')"; $sql = mysql_query($sSQL);
E por fim, lemos a tabela onde gravamos os dados da imagem como nome e caminho e as apresentamos montado um HTML bem simples.
$sql = mysql_query("SELECT * FROM paginas"); // Exibe as informações de cada usuário while ($usuario = mysql_fetch_object($sql)) { // Exibimos a foto echo "<img src='imgGrid/".$usuario->img."' alt='Foto de exibição' /><br />"; // Exibimos o nome e email echo "<b>Nome:</b> " . $usuario->descricao . "<br />"; echo "<b>URL:</b> " . $usuario->url . "<br /><br />"; }
É isso ai, temos nossas imagens guardas!
qualquer duvida estou a disposição! até mais.