Esse artigo tem como objetivo mostrar o upload de uma imagem sem dar refresh na tela e exibir a imagem após o upload. Para tal será utilizada a biblioteca Jquery e o plugin jquery.form para fazer o submit do form e para o código de upload será utilizado o PHP.

Apesar de ser upload de imagens, com uma pequena alteração pode-se enviar qualquer tipo de arquivos.

MySQL

Primeiramente criaremos a tabela no MySQL:


CREATE  TABLE `test`.`fotos` (
  `idfoto` INT NOT NULL AUTO_INCREMENT ,
  `foto` VARCHAR(150) NULL ,
  PRIMARY KEY (`idfoto`) );

index.php

Essa página contém o formulário de envio e a div para visualizar a imagem após o upload.


<form id="formulario" method="post" enctype="multipart/form-data" action="upload.php">
Foto
<input type="file" id="imagem" name="imagem" />
</form>
<div id="visualizar"></div>

Javascript


<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.form.js"></script>
<script type="text/javascript">
$(document).ready(function(){
     /* #imagem é o id do input, ao alterar o conteudo do input execurará a função baixo */
     $('#imagem').live('change',function(){
         $('#visualizar').html('<img src="ajax-loader.gif" alt="Enviando..."/> Enviando...');
        /* Efetua o Upload sem dar refresh na pagina */           $('#formulario').ajaxForm({
            target:'#visualizar' // o callback será no elemento com o id #visualizar
         }).submit();
     });
 })
</script>

upload.php

Nesse arquivo contém o código que efetua o upload para uma pasta com nome "fotos"


<?php
    include('db.php');
    $pasta = "fotos/";
    
    /* formatos de imagem permitidos */
    $permitidos = array(".jpg",".jpeg",".gif",".png", ".bmp");
    
    if(isset($_POST)){
        $nome_imagem    = $_FILES['imagem']['name'];
        $tamanho_imagem = $_FILES['imagem']['size'];
        
        /* pega a extensão do arquivo */
        $ext = strtolower(strrchr($nome_imagem,"."));
        
        /*  verifica se a extensão está entre as extensões permitidas */
        if(in_array($ext,$permitidos)){
            
            /* converte o tamanho para KB */
            $tamanho = round($tamanho_imagem / 1024);
            
            if($tamanho < 1024){ //se imagem for até 1MB envia
                $nome_atual = md5(uniqid(time())).$ext; 
                //nome que dará a imagem
                $tmp = $_FILES['imagem']['tmp_name']; 
                //caminho temporário da imagem
                
                /* se enviar a foto, insere o nome da foto no banco de dados */
                if(move_uploaded_file($tmp,$pasta.$nome_atual)){
                    mysql_query("INSERT INTO fotos (foto) 
                    VALUES (".$nome_atual.")");
                    echo "<img src='fotos/".$nome_atual."' 
                    id='previsualizar'>"; //imprime a foto na tela
                }else{
                    echo "Falha ao enviar";
                }
            }else{
                echo "A imagem deve ser de no máximo 1MB";
            }
        }else{
            echo "Somente são aceitos arquivos do tipo Imagem";
        }
    }else{
        echo "Selecione uma imagem";
        exit;
    }
   
?>