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:
- O primeiro parâmetro é o nome do arquivo que está guardado na memória do servidor;
- O segundo parâmetro é o destino do arquivo, composto pelo diretório físico no servidor onde o arquivo deverá ser salvo acompanhado do nome original do arquivo;
Tenha em mente que:
- Neste exemplo, estamos utilizando um diretório chamado upload_files que está um nível acima do nosso diretório atual;
- Arquivos que já existem no diretório com mesmo nome, serão substituídos pelo novo arquivo;
- Em alguns servidores é necessário inserir permissões de escrita (CHMOD) para a pasta de destino. Saiba como clicando AQUI;
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!