• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Baderous

PHP verificar input do tipo file

16 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

LOL QUE ESTUPIDO!

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;
}

0

Partilhar esta mensagem


Link 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