Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Como consigo salvar o "novo nome" da imagem que foi enviada para o servidor por meio de UPLOAD no mesmo registro em que estão sendo salvos os dados do formulário no banco de dados através do PHP.
Consigo salvar os campos do formulário, mas o nome que é gerado ao enviar a imagem, não estou conseguindo.
<?php
include 'conecta_mysql.inc';
if(isset($_FILES['arquivo']['name']) && $_FILES["arquivo"]["error"] == 0)
{
echo "<center>Você enviou o arquivo: <strong>" . $_FILES['arquivo']['name'] . "</strong><br /></center>";
echo "<center>Seu tamanho é: <strong>" . $_FILES['arquivo']['size'] . "</strong> Bytes<br /><br /></center>";
$arquivo_tmp = $_FILES['arquivo']['tmp_name'];
$nome = $_FILES['arquivo']['name'];
$extensao = strrchr($nome, '.');
$extensao = strtolower($extensao);
if(strstr('.jpg;.jpeg;.gif;.png', $extensao))
{
$novoNome = md5(microtime()) . '.' . $extensao;
$destino = 'imagens/' . $novoNome;
if( @move_uploaded_file( $arquivo_tmp, $destino ))
{
echo "<br>";
echo "<img src=\"" . $destino . "\" />";
echo "<br>";
}
else
echo "Erro ao salvar o arquivo. Aparentemente você não tem permissão de escrita.<br />";
}
else
echo "Você poderá enviar apenas arquivos \"*.jpg;*.jpeg;*.gif;*.png\"<br />";
}
else
{
echo "<center><h1>Você não enviou nenhum arquivo!</h1></center>";
echo "<center><br><h3><a href='javascript:window.history.go(-1)'>Clique aqui para volta.</a></h3></center>";
}
$codphoto = $_POST['codphoto'];
$nome = $_POST['nome'];
$datafotografia = $_POST['datafotografia'];
$photography = $_POST['novoNome'];
$sql = "INSERT INTO photograph VALUES";
$sql .= "( '$codphoto', '$nome', '$datafotografia', '$photography' )";
if ($conexao->query($sql) === TRUE) {
echo "<center> <h2> Obrigado !! Envio realizado com sucesso !! </h2></center>";
echo "<center><br><h3><a href='LINK_SITE'>ENVIAR OUTRA FOTOGRAFIA</a></h3></center>"; echo "Erro: " . $sql . "<br>" . $conexao->error;
}
$conexao->close();>
5 horas atrás, Omar~ disse:
Vou começar por isso:
Mesmo que o mesmo receba um código PHP sua extensão ".inc" é uma falha gravíssima de segurança pois expõe o código fonte.
Acredito eu que esse mesmo arquivo guarda informações do endereço, login e senha do banco de dados....
Pois bem qualquer um pode acessar-lo pelo browser e obter essas informações, assim sendo pode entrar no seu servidor e fazer o que quiser até mesmo remover seu acesso ao mesmo.
Dar uma olhada nesse vídeo será bem instrutivo para você
Agora nesse ponto:
Nunca use o caractere @ pois ele irá ofuscar qualquer erro, inclusive nesse caso, se não enviar a imagem o retorno da condicional é true, ou seja não enviou mas o php irá reconhecer que enviou.
Agora sobre o upload da imagem.
Não vou reinventar a roda aqui pois já criei uma classe que entrega isso já mastigado:
Então vamos nos concentrar no nome que terá a imagem, para isso vamos usar uma função que irá criar uma string aleatória:
<?php
function codigoAleatorio($quantidade = null) {
$letras = (isset($quantidade) ? (int) $quantidade : 10);
$caracteres = '0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVxXyYwWzZ0123456789';
$retorno = "";
$misturar = str_split($caracteres);
for ($i = 0; $i < $letras; $i++) {
$retorno .= $misturar[array_rand($misturar)];
}
return ($retorno);
}
Beleza então vamos fazer a coisa acontecer
Ocultar conteúdo
/ Primeiro temos que saber se existe algum arquivo /
if (isset($_FILES['arquivo']) && !empty($_FILES['arquivo']['name'])) {
// Agora verificamos se é uma imagem e se ela é jpg
switch ($_FILES['arquivo']['type']) {
case 'image/jpg':
case 'image/jpeg':
case 'image/pjpeg':
break;
default:
// Se entrar aqui é porque o arquivo enviado não é uma imagem ou não é jpg
}
$upload = new ImageUpload('imagens'); // Instanciamos a classe para upload
/* Obs.: O diretório de armazenamento no caso será a pasta "imagens"
* no mesmo diretório do arquivo que está executando isso.
* Caso seja nessesário use:
* __DIR__ '../../imagens/' <= ou seja desse diretório volte 2 e entre em imagens
*/
$nome_para_imagem = codigoAleatorio() . time(); // Criamos o nome da imagem (Nesse termo é impossível coexistir 2 com o mesmo nome)
// Enviamos então a imagem
// Parâmetros
// 1 - O arquivo
// 2 - Nome que terá
// 3 - Se for maior que 500X500 pixels redimencione a mesma para 500
$upload->sendImage($_FILES['arquivo'], $nome_para_imagem, 500);
// Agora verificamos se foi salva
if ($upload->setResult()) {
/* Esse é o real nome da imagem que foi armazenada
* Use isso para registrar no banco de dados
*/
$nome_da_imagem = $upload->getImgName();
} else {
// A imagem não foi salva
}
}
Para finalizar:
Faça o tratamento desses dados, simplesmente você está jogando em seu banco de dados qualquer coisa que o usuário informar, deixando sua aplicação totalmente vulnerável a sql-injetion. Ou mesmo pode ser um XSS para expor o código fonte de sua aplicação.
Imagino que fiz errado... veja só:
<?php
include 'conecta_mysql.inc';
// verifica se foi enviado um arquivo
function codigoAleatorio($quantidade = null) {
$letras = (isset($quantidade) ? (int) $quantidade : 10);
$caracteres = '0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVxXyYwWzZ0123456789';
$retorno = "";
$misturar = str_split($caracteres);
for ($i = 0; $i < $letras; $i++) {
$retorno .= $misturar[array_rand($misturar)];
}
return ($retorno);
}
/ Primeiro temos que saber se existe algum arquivo /
if (isset($_FILES['arquivo']) && !empty($_FILES['arquivo']['name'])) {
// Agora verificamos se é uma imagem e se ela é jpg
switch ($_FILES['arquivo']['type']) {
case 'image/jpg':
case 'image/jpeg':
case 'image/pjpeg':
break;
default:
// Se entrar aqui é porque o arquivo enviado não é uma imagem ou não é jpg
}
$upload = new ImageUpload('imagens'); // Instanciamos a classe para upload
/* Obs.: O diretório de armazenamento no caso será a pasta "imagens"
* no mesmo diretório do arquivo que está executando isso.
* Caso seja nessesário use:
* __DIR__ '../../imagens/' <= ou seja desse diretório volte 2 e entre em imagens
*/
$nome_para_imagem = codigoAleatorio() . time(); // Criamos o nome da imagem (Nesse termo é impossível coexistir 2 com o mesmo nome)
// Enviamos então a imagem
// Parâmetros
// 1 - O arquivo
// 2 - Nome que terá
// 3 - Se for maior que 500X500 pixels redimencione a mesma para 500
$upload->sendImage($_FILES['arquivo'], $nome_para_imagem, 500);
// Agora verificamos se foi salva
if ($upload->setResult()) {
/* Esse é o real nome da imagem que foi armazenada
* Use isso para registrar no banco de dados
*/
$nome_da_imagem = $upload->getImgName();
} else {
// A imagem não foi salva
}
}
$codphoto = $_POST['codphoto'];
$nome = $_POST['nome'];
$datafotografia = $_POST['datafotografia'];
$photography = $_POST['novoNome'];
$sql = "INSERT INTO photograph VALUES";
$sql .= "( '$codphoto', '$nome', '$datafotografia', '$photography' )";
$conexao->close();
$php>
@Alberto Nascimento Utilize da melhor forma nossa comunidade. Não use títulos de tópicos com letras maiúsculas isso é ofensivo e viola a boas práticas de uso aqui do fórum.
Também quando form mencionar uma pessoa não precisa citar tudo aquilo que ele escreveu isso polui demais seu próprio tópico, quando for citar apenas escreva um @ seguindo do nome da pessoa assim como eu fiz.
Agora vamos ao seu problema, que acredito eu que você não requereu os arquivos necessários, então preparei um exemplo bem completo aqui, essa é a arquitetura do exemplo
-
- [Pasta raiz]
-
--- index.php
-
--- post.php
-
--- [Pasta class]
-
------ ImageUpload.php
-
--- [Pasta function]
-
------ CodigoAleatorio.php
index.php
Spoiler
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Exemplo do Upload</title>
</head>
<body>
<form action="post.php" method="POST" enctype="multipart/form-data">
<p>codphoto</p>
<input type="text" name="codphoto" />
<p>nome</p>
<input type="text" name="nome" />
<p>datafotografia</p>
<input type="text" name="datafotografia" />
<!--
Nada de inputs com letras em caixa alta e baixa
<p>novoNome</p>
<input type="text" name="novoNome" />
-->
<p>novonome</p>
<input type="text" name="novonome" />
<p>Arquivo</p>
<input type="file" name="arquivo" accept="" />
<hr />
<button type="submit">Enviar</button>
</form>
</body>
</html>
class/ImageUpload.php
[https://github.com/Spell-Master/sm-web/blob/master/exemplos/corte-e-salvamento-de-imagens/ImageUpload.php](https://github.com/Spell-Master/sm-web/blob/master/exemplos/corte-e-salvamento-de-imagens/ImageUpload.php)
function/CodigoAleatorio.php
Spoiler
<?php
function CodigoAleatorio($quantidade = null) {
$letras = (isset($quantidade) ? (int) $quantidade : 10);
$caracteres = '0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVxXyYwWzZ0123456789';
$retorno = "";
$misturar = str_split($caracteres);
for ($i = 0; $i < $letras; $i++) {
$retorno .= $misturar[array_rand($misturar)];
}
return ($retorno);
}
post.php
Spoiler
<?phpecho ('Você está recebendo isso da super global $_POST:<pre>');
var_dump($_POST);
echo ('</pre>Você está recebendo isso da super global $_FILES<pre>');
var_dump($_FILES);
echo ('</pre>');$post = filter_input_array(INPUT_POST, FILTER_DEFAULT);
$codphoto = (isset($post['codphoto']) ? trim($post['codphoto']) : false);
$nome = (isset($post['nome']) ? trim($post['nome']) : false);
$datafotografia = (isset($post['datafotografia']) ? trim($post['datafotografia']) : false);
$novonome = (isset($post['novonome']) ? trim($post['novonome']) : false);
$upload_maximo = (int) preg_replace('/[^\d]+/', null, ini_get('upload_max_filesize')) . '000000';
try {
if (!$codphoto) {
throw new Exception('Ops! Digite algo em codphoto', 0);
} else if (!filter_var($codphoto, FILTER_SANITIZE_STRING)) {
throw new Exception('Ops! Você não pode usar caracteres expeciais em codphoto', 0);
} else if (!$nome) {
throw new Exception('Ops! Digite algo em nome', 0);
} else if (!filter_var($nome, FILTER_SANITIZE_STRING)) {
throw new Exception('Ops! Você não pode usar caracteres expeciais em nome', 0);
} else if (!$datafotografia) {
throw new Exception('Ops! Digite algo em datafotografia', 0);
} else if (!filter_var($datafotografia, FILTER_SANITIZE_STRING)) {
throw new Exception('Ops! Você não pode usar caracteres expeciais em datafotografia', 0);
} else if (!$novonome) {
throw new Exception('Ops! Digite algo em novonome', 0);
} else if (!filter_var($novonome, FILTER_SANITIZE_STRING)) {
throw new Exception('Ops! Você não pode usar caracteres expeciais em novonome', 0);
} else if (!isset($_FILES['arquivo'])) {
throw new Exception('Opa!! Alguém editou nosso html de forma malíciosa!!!', 1);
} else if ($_FILES['arquivo']['error']) {
throw new Exception($_FILES['arquivo']['error'], 1);
} else if (empty($_FILES['arquivo']['name'])) {
throw new Exception('Ops! Envie alguma imagem', 0);
} else if ($_FILES['arquivo']['size'] > $upload_maximo) {
throw new Exception('Ops! O arquivo é muito grande', 0);
}
switch ($_FILES['arquivo']['type']) {
case 'image/jpg':
case 'image/jpeg':
case 'image/pjpeg':
break;
default:
throw new Exception('Ops! Selecione só imagens JPG', 0);
}
require_once (__DIR__ . DIRECTORY_SEPARATOR . 'function' . DIRECTORY_SEPARATOR . 'CodigoAleatorio.php');
require_once (__DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'ImageUpload.php');
$localParaSalvar = __DIR__ . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR;
$nomeDaImagem = CodigoAleatorio(5) . time();
$Upload = new ImageUpload($localParaSalvar);
$Upload->sendImage($_FILES['arquivo'], $nomeDaImagem);
if ($Upload->getResult()) {
$save = [
'codphoto' => htmlentities($codphoto),
'nome' => htmlentities($nome),
'datafotografia' => htmlentities($datafotografia),
'novonome' => htmlentities($novonome),
'imagemnome' => $Upload->getImgName()
];
/*
* Bom daqui para fente é só gravar no banco os dados do array $save
* $save['codphoto'], $save['nome'], etc....
*/
} echo $e->getMessage();
break;
case 1: // Registrar Log de ERRO
// $e->getFile(); /* Aquivo que disparou o erro */
// $e->getFile(); /* Linha do arquivo que disparou o erro */
// $e->getMessage(); /* Motivo do erro */
break;
}
}@Omar~ seria no caso desta forma a se fazer?
Agora, quanto ao que enviou, notei que não há chamada para o banco de dados, correto?
Posso utilizar o seguinte arquivo ? Onde coloco o "include" ?
<?php
//cria a conexao mysqli_connect('localizacao BD', 'usuario de acesso', 'senha', 'banco de dados')
$conexao = mysqli_connect('', '', '', '');
//ajusta o charset de comunicação entre a aplicação e o banco de dados
mysqli_set_charset($conexao, 'utf8');
//verifica a conexão
if ($conexao->connect_error) {
die("Falha ao realizar a conexão: " . $conexao->connect_error);
}
?>
E para inserir, seria este comando?
$sql = "INSERT INTO photograph VALUES";
$sql .= "( '$codphoto', '$nome', '$datafotografia', '$novonome' )";@Omar~ veja só:
Esta retornando o seguinte erro no arquivo "error_log" que é gerado dentro da pasta onde se encontram os arquivos PHP:
var_dump($_POST);
>
Citar
[27-Mar-2020 19:03:58 America/Fortaleza] PHP Fatal error: Call to undefined function var_dump() in /<link>/post.php on line 4
Vou começar por isso:
>
8 horas atrás, Alberto Nascimento disse:
>
8 horas atrás, Alberto Nascimento disse:
if( @move_uploaded_file( $arquivo_tmp, $destino ))
Nunca use o caractere @ pois ele irá ofuscar qualquer erro, inclusive nesse caso, se não enviar a imagem o retorno da condicional é true, ou seja não enviou mas o php irá reconhecer que enviou.
Agora sobre o upload da imagem.
Não vou reinventar a roda aqui pois já criei uma classe que entrega isso já mastigado:
https://github.com/Spell-Master/sm-web/blob/master/exemplos/corte-e-salvamento-de-imagens/ImageUpload.php
Então vamos nos concentrar no nome que terá a imagem, para isso vamos usar uma função que irá criar uma string aleatória:
/ Primeiro temos que saber se existe algum arquivo /
>
9 horas atrás, Alberto Nascimento disse: