Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida sobre scrip de upload que montei.


HUGO BORGES

Pergunta

Bom galera montei um scrip de upload em PHP + MySQL, com vários tutorias pela net.

Segue a estrutura dele:

DB do MySQL:

CREATE TABLE `imagens` (
  `id` real NOT NULL auto_increment,
  `foto` varchar(25) NOT NULL,
  PRIMARY KEY  (`id`)
);
Config:
<?php
// Conexão com o banco de dados MySQL
$db="teste";
$Server_site="localhost";
$Login_admin="root";
$Senha_admin="";

// Conecta paginas a DB
$conexao  = mysql_connect("$Server_site", "$Login_admin", "$Senha_admin") or die ("O servidor não responde!");
$banco = mysql_select_db("$db") or die ("Não foi possivel conectar-se ao banco de dados!");
?>
Index.php:
<html>
<head>
<title>Upload</title>
</head>
<body bgcolor = "#FFFFFF" text = "#000000">
<form name = "form1" method = "post" action = "upload.php" enctype = "multipart/form-data">
<input type = "file" name = "arquivo">
<input type = "submit" name = "Submit" value = "Enviar">
</form>
</body>
</html>
upload.php:
<?php

 include "Config.php"; 

// Se existir o arquivo
if(isset($_FILES["arquivo"])){
  $arquivo = $_FILES["arquivo"];
  $pasta_dir = "";//diretorio dos arquivos
  $arquivo_nome = $pasta_dir . $arquivo["name"];

 // Faz o upload da imagem
 move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);


  // Envia os dados ao banco de dados
  $inserir = mysql_query ("INSERT INTO imagens VALUES ('','$arquivo_nome')");

  // Verifica se foi enviados os dados
  if ($inserir == 1)
   { echo "<script>alert('Foto ADD com sucesso.');  history.back();</script>"; die; }



}

?>

Bom ai esta a estrutura dele, o que eu quero saber e como fazer para que possa ser enviado apenas imagens JPG, GIF, PNG.

E também quero saber como fazer para que ele renomeia a imagem para um nome qualquer.

Vlw galera aguardo contato

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

1 - ..como fazer para que possa ser enviado apenas imagens JPG, GIF, PNG.

Recupera a extensão do arquivo que será salvo e compare, por exemplo.

//tranforma o nome da imagem em um array
$arquivo = $_FILES["arquivo"];
$arrArquivo = explode('.',$arquivo); // tranforma em array o nome do arquivo
$fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); //obtem a extensão do arquivo

$arrExtPermitidas = array('JPG', 'GIF', 'PNG'); //array com as extensões permitidas


//caso a extensão não for permitida
if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){
    echo "arquivo não autorizado";
    exit();
}
2- E também quero saber como fazer para que ele renomeia a imagem para um nome qualquer. Só definir um nome e a extensão para o arquivo. Exemplo:
$arquivo_nome = $pasta_dir . 'arquivo_nomeado_pelo_sistema.' . $fileExtencion;

Link para o comentário
Compartilhar em outros sites

  • 0

Como a resposta de Romero Dias foi bastante esclarecedora, eu vim aqui pra mostrar um possivel erro no parte de conexão ao banco de dados.

Nessa linha:

$conexao  = mysql_connect("$Server_site", "$Login_admin", "$Senha_admin") or die ("O servidor não responde!");
$banco = mysql_select_db("$db") or die ("Não foi possivel conectar-se ao banco de dados!");
Que seria certo sem as aspas nas variaveis Ficando assim:
$conexao  = mysql_connect($Server_site, $Login_admin, $Senha_admin) or die ("O servidor não responde!");
$banco = mysql_select_db($db) or die ("Não foi possivel conectar-se ao banco de dados!");

Link para o comentário
Compartilhar em outros sites

  • 0

Romero Dias,bom eu tentei colocar mais este scrio seu, ele ficou assim:

// Verifica se existir o arquivo (Foto)
  if(isset($_FILES["arquivo"])){
   $arquivo = $_FILES["arquivo"];
   
   $arrArquivo = explode('.',$arquivo); // tranforma em array o nome do arquivo
   $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); //obtem a extensão do arquivo
   $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); //array com as extensões permitidas

   //caso a extensão não for permitida
   if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){
    echo "arquivo não autorizado";
    exit();
   }

   $pasta_dir = "../Imagens/Imagens_BD/Equipe/";  // Diretorio dos arquivos
   $arquivo_nome = $pasta_dir . $arquivo["name"];

   // Faz o upload da imagem
   move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);
   $foto = $arquivo["name"];
  }
Porem ocorreu o seguinte erro:
Warning: explode() expects parameter 2 to be string, array given in /opt/lampp/htdocs/www/HDR Info/adm/Equipe.php on line 45
arquivo não autorizado
Na linha 45 não tem nada, e a linha 44 é esta aqui:
$arrExtPermitidas = array('JPG', 'GIF', 'PNG'); //array com as extensões permitidas

O estranho e que a imagem que estou tentando enviar e JPG.

------------------------------------------------------------------------------------------------------------

david.lyonnais, VLW.

Eu retirei as ", mas não entendi o porque elas poderiam ser um possível erro, poderia me explicar?

Link para o comentário
Compartilhar em outros sites

  • 0

Romero Dias, bom agora deu certo vlw.

Mas voltando a minha pergunta 2, poderia me explicar esta função porque não entendi muito bem.

$arquivo_nome = $pasta_dir . 'arquivo_nomeado_pelo_sistema.' . $fileExtencion;
No meu scrip a variável que recebe o nome da foto e grava ela no BD e a $foto, como no exemplo abaixo:
// Faz o upload da imagem
   move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);
   $foto = $arquivo["name"];

O motivo que fiz assim foi que preciso gravar apenas o nome da imagem e não o caminho todo.

O problema que que nunca pode aver substituição, tipo a imagem tem que ser renomeada por um nome que não exista ainda, assim não perco nem uma imagem.

Link para o comentário
Compartilhar em outros sites

  • 0

Fala Hugo,

Claro que explico.

A variável $arquivo_nome, recebe a pasta/nome_do_arquivo onde deve ser salvo

Essa string 'arquivo_nomeado_pelo_sistema.', foi só um exemplo para te mostrar o nome que o arquivo vai ter, e $fileExtencion a extensão do arquivo.

$arquivo_nome = $pasta_dir . 'arquivo_nomeado_pelo_sistema.' . $fileExtencion;
Voce pode melhorar o script, criando um nome único para o arquivo. Exemplo:
//gera um identificador único para o arquivo
$nomeDoArquivo = md5(uniqid(rand(), true));

//definindo o destino do arquivo
$arquivo_nome = $pasta_dir . $nomeDoArquivo . '.' . $fileExtencion;

//salva o arquivo
move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);

O motivo que fiz assim foi que preciso gravar apenas o nome da imagem e não o caminho todo.

Para salvar um arquivo com a função move_uploaded_file();, você precisa passar o caminho/nome do arquivo para a função saber o destino.

Depois da uma olhada na documentação da função move_uploaded_file();

Deu uma clareada ai? rsrs

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bom Romero, deu certo sim, com isso o scrip ta quase pronto, ele esta assim:

// Verifica se existir o arquivo (Foto)
  if(isset($_FILES["arquivo"])){
   $arquivo = $_FILES["arquivo"];
   
   $arrArquivo = explode('.',$arquivo['name']); // Tranforma em array o nome do arquivo
   $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); // Obtem a extensão do arquivo
   $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); // Array com as extensões permitidas

   // Caso a extensão não for permitida
   if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){
    echo "<script>alert('ERRO. Formato da imagem não e suportado.'); history.back();</script>";
    exit();
   }

   // Gera um identificador único para o arquivo
   $nomeDoArquivo = md5(uniqid(rand(), true));

   $pasta_dir = "../Imagens/Imagens_BD/Equipe/";  // Diretorio dos arquivos
   // Definindo o destino do arquivo
   $arquivo_nome = $pasta_dir . $nomeDoArquivo . '.' . $fileExtencion;

   // Faz o upload da imagem
   move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);
   $foto = $nomeDoArquivo . '.' . $fileExtencion;
  }
Muito obrigado por tar me esplicando tudo :). Mas se não simportar vo fazer mais 2 perguntas para finalizar; 1° Com isto nem uma imagem não vai ser perdida não é?, tipo o scrip sempre vai gerar um nome que não existe por outra imagem? 2° Bom esta e mais complicada, você notou que o BD foi feito assim:
CREATE TABLE `imagens` (
  `id` real NOT NULL auto_increment,
  `foto` varchar(25) NOT NULL,
  PRIMARY KEY  (`id`)
);

Suponha que quero trocar a foto da ID 6, como posso fazer para que a foto antiga seja apagada e seja inserida a foto nova? Assim não ira ficar fotos em desuso no servidor.

Vlw aguardo seu contato :).

Link para o comentário
Compartilhar em outros sites

  • 0

1° Com isto nem uma imagem não vai ser perdida não é?, tipo o scrip sempre vai gerar um nome que não existe por outra imagem?

Com certeza, eu uso e recomendo a função md5(uniqid(rand(), true));, ela vai gerar um valor único.

2° Bom esta e mais complicada, você notou que o BD foi feito assim:

Bom, eu consigo enxergar duas soluções.

1ª - armazene o valor do md5(uniqid(rand(), true)); no campo foto. E qual a finalidade do campo foto na sua tabela?

2ª - quando for salvar o arquivo, coloque o nome dele como o id do registro da tabela. ou seja, se o id for 1, o arquivo seria salvo com 1.jpg.

Editado por Romero Dias
Link para o comentário
Compartilhar em outros sites

  • 0

Bom funciona assim:

NA coluna foto fica salvo o nome da foto,assim quando pesquisar pelos dados do ID (X) Vou ver a foto (X).

Entendeu?

Estava com algo em menta assim, quando eu clicar em deletar foto, algum comando vai ver o nome e extensão da foto e vai deletar ela, assim depois e so eu colocar uma foto novo, Entendeu?

------------------------------------------------------------- EDIT ------------------------------------------------

Bom tive aqui pesquisando e já achei uma solução, no arquivo edit eu coloco a seguinte linha:

unlink('../Imagens/Imagens_BD/Equipe/' . $resultado->linkfoto);
Ela deleta a foto antiga do BD e depois vem o comando:
$arquivo = $_FILES["arquivo"];
   
   $arrArquivo = explode('.',$arquivo['name']); // Tranforma em array o nome do arquivo
   $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); // Obtem a extensão do arquivo
   $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); // Array com as extensões permitidas

   // Caso a extensão não for permitida
   if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){
    echo "<script>alert('ERRO. Formato da imagem não e suportado.'); history.back();</script>";
    exit();
   }

   // Gera um identificador único para o arquivo
   $nomeDoArquivo = md5(uniqid(rand(), true));

   $pasta_dir = "../Imagens/Imagens_BD/Equipe/";  // Diretorio dos arquivos
   // Definindo o destino do arquivo
   $arquivo_nome = $pasta_dir . $nomeDoArquivo . '.' . $fileExtencion;

   // Faz o upload da imagem
   move_uploaded_file($arquivo["tmp_name"], $arquivo_nome);
   $foto = $nomeDoArquivo . '.' . $fileExtencion;

Que re-coloca a nova foto.

Bom isto esta funcionando perfeitamente, quando eu coloco uma foto nova ele deleta a antiga, ficando a nova foto, so tem um problema se eu não colocar foto nem uma ele deleta a foto antiga, deixando a tabela sem foto.

Bom o que eu quero sabe e como fazer para que este código acima so rode se tiver uma imagem colecionada?

Editado por HUGO BORGES
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...