Ir para o conteúdo
Baderous

PHP verificar input do tipo file

Mensagens Recomendadas

Baderous

Tenho um input do tipo file, que serve para seleccionar um ficheiro, para depois carregar num botão de submit e enviar o ficheiro para uma base de dados. Como é que posso verificar se já se seleccionou o ficheiro? (para poder apresentar uma mensagem de informação em caso contrário). Já andei aqui com isset de $_POST e $_FILES mas não consigo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Antes do envio? Não sei, mas isso tem de ser com JavaScript. Depois do upload, é veres a documentação do $_FILES.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cyclop

É de notar que as validações por Javascript são bastante fáceis de contornar, caso queiras que o utilizador envie mesmo um ficheiro deves de verificar sempre do lado do servidor


"Quando eu for grande quero ser como o Celso"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Vou postar aqui mais uma dúvida já que é relacionada. Quero inserir ficheiros numa base de dados. Para isso, quero enviar para uma tabela "blobs" porções do ficheiro que são armazenadas consecutivamente na tabela, sendo guardado um identificador (id_blob) que me permite identificar as porções de um mesmo ficheiro. Assim, tenho a seguinte tabela:

# blobs

- index_blob INT(10) (PK)

- id_blob INT(10)

- blob MEDIUMBLOB

Defini uma constante que vai indicar o tamanho de bytes armazenado então em cada linha (as tais porções do ficheiro). Depois, vou lendo do ficheiro essa quantidade de bytes até encontrar o end-of-file, e vou armazenando na tabela:

define("MAX_SQL",40000);
$fp = fopen($tmpName, 'rb') or die( "Impossível abrir ficheiro!" );
$id_ficheiro = mysql_insert_id();

while (!feof($fp)) {
	$data = base64_encode(fread($fp,MAX_SQL));
	$query = "INSERT INTO blobs (id_blob, blob) VALUES ('$id_ficheiro',\"".$data."\")";
	$result = mysql_query($query) or die ('aqui');
}

O código foi adaptado daqui: http://pt.php.net/manual/en/features.file-upload.php#35583

Apesar de me parecer que a query está certa, isto não funciona. Já testei o $id_ficheiro, o fread, o MAX_SQL, o $data e todos estão bem, não percebo :/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Dá algum erro? Mete or die(mysql_error()); na parte do mysql_query.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'blob) VALUES ('28',"/9j/4RIwRXhpZgAATU0AKgAAAAgACQEPAAIAAAAUAAAAngEQAAIAAAAPAAAA' at line 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Tens a certeza que estás a cumprir o packet size limit do MySQL?


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

No my.cnf tenho estes dados:

max_allowed_packet = 1M

table_cache = 64

sort_buffer_size = 512K

net_buffer_length = 8K

read_buffer_size = 256K

read_rnd_buffer_size = 512K

myisam_sort_buffer_size = 8M

Mas penso que não seja disso, ainda agora alterei para 10 o nº de bytes da constante MY_SQL que defini e não deu.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Experimenta assim:

define("MAX_SQL",40000);
$fp = fopen($tmpName, 'rb') or die( "Impossível abrir ficheiro!" );
$id_ficheiro = mysql_insert_id();

while (!feof($fp)) {
	$data = mysql_real_string_escape(base64_encode(fread($fp,MAX_SQL)));
	$query = "INSERT INTO blobs (id_blob, blob) VALUES ('$id_ficheiro',\"".$data."\")";
	$result = mysql_query($query) or die ('aqui');
}

Anyway, tens a certeza que o $id_ficheiro tem o ID suposto na primeira iteração? É que:

Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

E continuou a não dar nada? (PS: esqueci-me do mysql_error() lá no die).


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Aconteceu algo estranho. Retirei o campo index_blob da tabela e já deu...

$query = "INSERT INTO blobs VALUES ('$id_ficheiro',\"".$data."\")";

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

LOL QUE ESTUPIDO!

Tipo, o blob_id é um inteiro, tu estavas a passar uma string. :)


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

O problema não era esse. O problema é que estava a usar o nome "blob" como campo da tabela e "blob" é um nome reservado.

Agora só me falta meter isto a visualizar ficheiros de vídeo e som numa página. Preciso de usar a tag <object> ?

Eu usei os headers para mostrar, mas só dá imagens.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
skin

Quanto à validação do ficheiro via JavaScript e sem recorrer ao servidor temos:

function checkFileExt(ctrl) 
{
    //set the name of our form
    var form = document.form1;
    //retrieve our control
    var file = DOMCall(ctrl).value;
    var type = "";
    //create an array of acceptable files
    var validExtensions = new Array(".csv", ".ldif");
    var allowSubmit = false;
    //if our control contains no file then alert the user
    if (file.indexOf("\\") == -1)
    {
        alert("You must select a file before hitting the Submit button");
        return false;;
    }
    else
    {
        //get the file type
        type = file.slice(file.indexOf("\\") + 1);
        var ext = file.slice(file.lastIndexOf(".")).toLowerCase();
        //loop through our array of extensions
        for (var i = 0; i < validExtensions.length; i++) 
        {
            //check to see if it's the proper extension
            if (validExtensions[i] == ext) 
            { 
                //it's the proper extension
                allowSubmit = true; 
            }
        }
    }
    //now check the final bool value
    if (allowSubmit == false)
    {
        //let the user know they selected a wrong file extension
        alert("Only files with extensions " + (extArray.join("  ").toUpperCase()) + " are allowed");
        return false;
    }
    else
    {
        return true
    }       
    return allowSubmit;
}


Our lives begin to end the day we become silent about things that matter - Martin Luther King

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.