Ser Programador

Como fazer upload de arquivos com PHP

Entenda o funcionamento dos uploads de arquivo usando o PHP.


Hoje nós vamos ver o passo a passo na prática do processo de upload de um arquivo.


Para começar, precisamos ter um formulário de upload já criado corretamente. Você pode conferir como construi-lo clicando AQUI.


Quando um arquivo é enviado para o servidor, nós não vamos conseguir resgata-lo através da variável superglobal $_POST como resgatamos normalmente os dados dos demais inputs. A superglobal a ser utilizada neste caso é $_FILES.

Suponhemos que o name do seu input file seja image. Sendo assim resgataremos os dados do seu arquivo enviado assim:

    	$file = $_FILES['image'];
	

Se você estiver utilizando o atributo multiple em seu input file, é necessário então fazer um loop na superglobal $_FILES pois ela receberá os dados dos arquivos enviados em forma de array multidimensional. Demonstrarei logo abaixo.


Por padrão, para todo upload via PHP, é gerado um arquivo temporário na memória do servidor. Conseguimos saber o nome deste arquivo resgatando o valor da chave tmp_name do array que extraímos da superglobal $_FILES.

Vejamos:

    	$file		= $_FILES['image'];
        $nome_temp	= $file['tmp_name'];
	

Da mesma forma podemos resgatar o nome original do arquivo:

    	$file		= $_FILES['image'];
        $nome_temp	= $file['tmp_name'];
        $nome		= $file['name'];
	

Uma vez que já temos estes dados do arquivo enviado, já podemos resgatar da memória do servidor o arquivo. Para isso utilizaremos a seguinte função do PHP:

        move_uploaded_file($nome_temp, '../upload_files/' . $nome);
	

Onde:


Tenha em mente que:


Caso o seu PHP esteja configurado para não apresentar erros em tela, você conseguirá retornar para o usuário uma mensagem de erro, tratando o retorno da função de upload. Veja:

    	if (move_uploaded_file($nome_temp, '../upload_files/' . $nome) === FALSE) {
        	$erro = error_get_last();
            echo $erro['message'];
        }
	

Por exemplo, no caso do seu diretório não existir, este erro será apresentado na tela como algo parecido com:

    	move_uploaded_file(): Unable to move 'C:\xampp\tmp\php4BEE.tmp' to '../upload_files/Jellyfish.jpg'
    

Vamos ao exemplo completo:

    	$file		= $_FILES['image'];
        $nome_temp	= $file['tmp_name'];
        $nome		= $file['name'];
        
        if (move_uploaded_file($nome_temp, '../upload_files/' . $nome) === FALSE) {
        	$erro = error_get_last();
            echo $erro['message'];
        } else {
	        echo 'Arquivo ' . $nome . ' enviado com sucesso.';
		}
	


Se você estiver utilizando o atributo multiple em seu input file, é necessário então fazer um loop na superglobal $_FILES. Veja abaixo como ficaria o mesmo exemplo, agora com loop:

    	$qtd_arquivos = count($_FILES['image']['name']);
	
        for ($i = 0; $i < $qtd_arquivos; $i++) {
            $file		= $_FILES['image'];
            $nome_temp	= $file['tmp_name'][$i];
            $nome		= $file['name'][$i];
            
            if (move_uploaded_file($nome_temp, '../upload_files/' . $nome) === FALSE) {
                $erro = error_get_last();
                echo $erro['message'];
            } else {
                echo 'Arquivo ' . $nome . ' enviado com sucesso.';
            }
        }
	


Seguindo corretamente todos os passos, você já conseguirá efetuar upload de arquivos perfeitamente!