+14

Upload de imagens com segurança

criado por Alfred R. Baudisch em 29/01/2004 8:56am
Iniciamos criando a página com o formulário de envio da imagem.
Usaremos como nome de arquivo: “foto.html”

<form action=”upload.php” method=”post”  enctype="multipart/form-data">
Envie sua foto para o site! <input type=”file” name=”foto”><BR>
<input type=”submit” value=”Enviar Foto!”>
</form>

Criamos agora, o arquivo “upload.php”, que processa e verifica o upload da foto do usuário:

<?php
$erro = $config = array();

// Prepara a variável do arquivo
$arquivo = isset($_FILES["foto"]) ? $_FILES["foto"] : FALSE;

// Tamanho máximo do arquivo (em bytes)
$config["tamanho"] = 106883;

// Largura máxima (pixels)
$config["largura"] = 350;

// Altura máxima (pixels)
$config["altura"]  = 180;

// Formulário postado... executa as ações
if ($arquivo) {  
    // Verifica se o mime-type do arquivo é de imagem
    if (!eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $arquivo["type"])) {
        $erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
    } else {
        // Verifica tamanho do arquivo
        if ($arquivo["size"] > $config["tamanho"]) {
            $erro[] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";
        }
        
        // Para verificar as dimensões da imagem
        $tamanhos = getimagesize($arquivo["tmp_name"]);
        
        // Verifica largura
        if ($tamanhos[0] > $config["largura"]) {
            $erro[] = "Largura da imagem não deve ultrapassar " . $config["largura"] . " pixels";
        }

        // Verifica altura
        if ($tamanhos[1] > $config["altura"]) {
            $erro[] = "Altura da imagem não deve ultrapassar " . $config["altura"] . " pixels";
        }
    }
    
    // Imprime as mensagens de erro
    if (sizeof($erro)) {
        foreach ($erro as $err) {
            echo " - " . $err . "<BR>";
        }

        echo "<a href=\"foto.html\">Fazer Upload de Outra Imagem</a>";
    }

    // Verificação de dados OK, nenhum erro ocorrido, executa então o upload...
    else
    {
        // Pega extensão do arquivo
        preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $arquivo["name"], $ext);

        // Gera um nome único para a imagem
        $imagem_nome = md5(uniqid(time())) . "." . $ext[1];

        // Caminho de onde a imagem ficará
        $imagem_dir = "fotos/" . $imagem_nome;

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

        echo "Sua foto foi enviada com sucesso!";
    }
}
?>

Comentários:

Mostrando 1 - 10 de 68 comentários
Bruno disse:
No meu deu o seguinte erro (Deprecated: Function eregi() is deprecated in)
Alguem sabe como solucionar?
18/08/2013 9:50am (~3 anos atrás)

Henrique disse:
não consegui instalar ele como eu faso ????
12/07/2010 1:30pm (~6 anos atrás)

De nada adianta alterar o tamanho máximo do arquivo! Não consigo fazer uploads com tamanho de 3MB!

Mesmo alterando esta parte:

// Tamanho máximo do arquivo (em bytes)
$config["tamanho"] = 106883;

Para, por exemplo:

$config["tamanho"] = 427532; //4mb


Dá erro!!!!!!!! Mesmo que a imagem tenha as dimensões dentro dos limites! Algúm sabe como resolver? Abaixo o código completo:

<?php

session_start();
require_once("verifica.php");
require_once("connect.php");

//PEGA O ID DO VENDEDOR

$idvendedor = mysql_query ("SELECT idvendedor
FROM vendedor
WHERE vendedor.login = '$_SESSION[login]'
");

$idvendedor = mysql_fetch_row($idvendedor);
$idvendedor = $idvendedor [0];



//pega o número da NF

$nf = $_SESSION[nf];




//prepara variáveis

$erro = array();




// Prepara a variável do arquivo
$arquivo = isset($_FILES["foto"]) ? $_FILES["foto"] : FALSE;




// Tamanho máximo do arquivo (em bytes)
$config = 427532; //4mb




// Formulário postado... executa as ações
if ($arquivo) {


// Verifica se o mime-type do arquivo é de imagem
if (!eregi("^image\/(pjpeg|jpeg)$", $arquivo["type"])) {
$erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
}

else

{
// Verifica tamanho do arquivo
if ($arquivo["size"] > $config) {
$erro[] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";

}

}

// Imprime as mensagens de erro
if (sizeof($erro)) {
foreach ($erro as $err) {
echo "<script>window.location.href='erro_upload.php'</script>";
}

echo "<script>window.location.href='erro_upload.php'</script>";
}

// Verificação de dados OK, nenhum erro ocorrido, executa então o upload...
else
{
// Pega extensão do arquivo
preg_match("/\.(jpg|jpeg){1}$/i", $arquivo["name"], $ext);


// Gera um nome único para a imagem
$imagem_nome = md5(uniqid(time())) . "." . $ext[1];


// Caminho de onde a imagem ficará
$imagem_dir = "notasfiscais_secureid/" . $imagem_nome;


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


//coloca o caminho da foto no banco de dados

$sql = mysql_query ("UPDATE nota
SET foto1 = '$imagem_nome'
WHERE nota.numeronf = $nf AND nota.idvendedor = $idvendedor
");


//volta para a lista de upload

echo "<script>window.location.href='lista_upload.php'</script>";
}
}
?>
30/04/2010 12:16pm (~6 anos atrás)

100%!!!!!! Funciona!!!!!

Na pasta de destino, que receberá o upload, atribua as permições de gravação de pasta para o público (cmod 777).

VALEU!
31/12/2009 4:02am (~7 anos atrás)

Segue tabela completa com os mime types:
http://www.grupostbrasil.com.br/mime.sql

Segue lista completa dos mime types:
* ==>> application/octet-stream
asf ==>> video/x-ms-asf
asp ==>> text/asp
asr ==>> video/x-ms-asf
asx ==>> application/x-mplayer2
asx ==>> video/x-ms-asf
asx ==>> video/x-ms-asf
au ==>> audio/basic
avi ==>> video/x-msvideo
bas ==>> text/plain
bin ==>> application/octet-stream
bmp ==>> image/bmp
c ==>> text/plain
class ==>> application/java
class ==>> application/java-byte-code
class ==>> application/octet-stream
class ==>> application/x-java-class
css ==>> text/css
dms ==>> application/octet-stream
doc ==>> application/msword
dot ==>> application/msword
exe ==>> application/octet-stream
flr ==>> x-world/x-vrml
gif ==>> image/gif
gz ==>> application/x-gzip
h ==>> text/plain
hlp ==>> application/winhlp
hta ==>> application/hta
htc ==>> text/x-component
htm ==>> text/html
html ==>> text/html
ico ==>> image/x-icon
jpe ==>> image/jpeg
jpeg ==>> image/jpeg
jpg ==>> image/jpeg
js ==>> application/x-javascript
lha ==>> application/octet-stream
lsf ==>> video/x-la-asf
lsx ==>> video/x-la-asf
lzh ==>> application/octet-stream
m3u ==>> audio/x-mpegurl
mdb ==>> application/x-msaccess
mid ==>> audio/mid
mov ==>> video/quicktime
movie ==>> video/x-sgi-movie
mp2 ==>> video/mpeg
mp3 ==>> audio/mpeg
mpa ==>> video/mpeg
mpe ==>> video/mpeg
mpeg ==>> video/mpeg
mpg ==>> video/mpeg
mpv2 ==>> video/mpeg
pdf ==>> application/pdf
pot ==>> application/vnd.ms-powerpoint
pps ==>> application/vnd.ms-powerpoint
ppt ==>> application/vnd.ms-powerpoint
qt ==>> video/quicktime
ra ==>> audio/x-pn-realaudio
ram ==>> audio/x-pn-realaudio
rmi ==>> audio/mid
rtf ==>> application/rtf
rtx ==>> text/richtext
snd ==>> audio/basic
stm ==>> text/html
tar ==>> application/x-tar
txt ==>> text/plain
vrml ==>> x-world/x-vrml
wav ==>> audio/x-wav
wrl ==>> x-world/x-vrml
wrz ==>> x-world/x-vrml
xaf ==>> x-world/x-vrml
xla ==>> application/vnd.ms-excel
xlc ==>> application/vnd.ms-excel
xlm ==>> application/vnd.ms-excel
xls ==>> application/vnd.ms-excel
xlt ==>> application/vnd.ms-excel
xlw ==>> application/vnd.ms-excel
xml ==>> application/xml
xml ==>> text/xml
xof ==>> x-world/x-vrml
zip ==>> application/x-compressed
zip ==>> application/x-zip-compressed
zip ==>> application/zip
zip ==>> multipart/x-zip
15/06/2007 9:19am (~9 anos atrás)

Mauro disse:
Dá o erro e tem a pasat fotos no diretório:

Warning: move_uploaded_file(fotos/e0e487e9a9.jpg) [function.move-uploaded-file]: failed to open stream: Permission denied in /home/xyz/public_html/templat/adm/imgs.php on line 86

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpo7Pp8W' to 'fotos/e0e487e9a9.jpg' in /home/xyz/public_html/templat/adm/imgs.php on line 86
04/12/2006 4:44pm (~10 anos atrás)

Muito bom o tutorial Alfred! Estava procurando um script para upload de imagens a um bom tempo...

Mas tem um probleminha, eu queria que as imagens fossem gravadas com o nome original dela ou com: "palavrafixa_onomeorigial". Como faço isso?
13/11/2006 9:22am (~10 anos atrás)

Bom dia, cara quando eu executo esse codigo, vai normal, mas quando eu adiciono ele na minha pagina para fazer upload, da o seguinte erro no php "Notice: Undefined offset: 1 in ... ", como eu arrumo isso?

abraços.
11/10/2006 7:21am (~10 anos atrás)

da maneira que eu fiz, com o cadastro em duas etapas, funcionou legal, o que eu quero é que trabalhe tudo no mesmo formulario
19/09/2006 6:38am (~10 anos atrás)

Instalei sem qualquer problema o script e funcionou. Porém não consegui fazer exatamente o que eu queria, que é uma página de cadastro no banco de dados incluindo a foto. Depois de muito penar, eu fiz o seguinte, na primeira página entra-se com os dados e escolhe-se num "radio" se vai ter imagem ou não, caso não haja a coluna "logo" do banco de dados recebe um "n" e o apos processado o formaulário a página volta para a página principal. Caso seja escolhida a opção que há imagem, a coluna logo recebe um id unica gerada com o md5 deste script, e essa variavel é passada para a pagina do formulario de upload de imagens, que por sua vez é passado para a página do script. Eu usei o dreamweaver para gerar a tabela decadastro no mysql, e a action do form é para a própria página. tentei inserir o script por aí e tentei também após adcionar tudo no banco de dados, ir para a página do script, mas nada funcionou... Alguém poderia dizer como fazer esse script funcionar dentro de um formulário que também envia dados para um banco de dados? obrigado
19/09/2006 6:36am (~10 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)