Upload simples de arquivo no PHP
1 - Salve o projeto no local adequado
Crie uma pasta para o projeto chamada upload e salve os arquivos que serão apresentados durante o tutorial dentro dela.
Dentro da pasta upload, crie também uma pasta chamada imagens, nela ficarão armazenadas as imagens que enviaremos através do upload.
A pasta upload deve ser colocada na pasta local de qualquer aplicativo de servidor web-local o qual você faça uso, como Wampserver - caminho: C:\wamp\www, pasta local do XAMPP, ou se preferir e tiver acesso a um provedor de hospedagem, colocar na pasta public_HTML. Isso se faz necessário para que os arquivos possam ser interpretados e executados adequadamente, obtendo o resultado esperado.
2 - Criando a página HTML
Vá até seu editor de texto ou IDE preferido e digite o código conforme abaixo:
Salve a página como upload.html
Basicamente criamos uma simples página contendo um formulário, o qual possuí apenas dois inputs, o primeiro na linha 11 é type="file" - o que permite localizar um arquivo no sistema. o segundo na linha 12 é apenas um input type="submit", ou seja, um botão que irá efetuar o envio do arquivo.
Na tag form, opção action, linha 9, é definido o script PHP que será chamado ao clicarmos no botão de envio do arquivo, em breve vamos criá-lo. O método que vamos utilizar é o POST conforme definido através da opção method e indicamos para o servidor que irá ocorrer um upload ao utilizarmos a opção enctype="multipart/form-data".
3 - Criação da include config_upload.inc
Essa include tem como objetivo facilitar a validação do upload, simplesmente é um arquivo PHP que contém algumas variáveis que serão utilizadas pelo script de execução do upload, o comentário acima de cada variável informa o objetivo de cada uma delas.
Digite o código conforme mostrado abaixo e salve o arquivo como config_upload.inc
Caso você queira fazer upload de outras extensões de arquivos, como aceitar .pdf .txt .xls, basta adicionar ao array da variável $extensões_validas, o mesmo serve para tamanho do arquivo e etc...
3 - Criação do script PHP
Entendendo o script linha a linha:
Linha 2 - Aqui utilizamos o comando set_time_limit(0), para eliminarmos o tempo limite de execução do upload - se não eliminarmos esse limite e o arquivo for muito grande e o mesmo ocorrer com seu tempo de transferência o upload pode não ocorrer com sucesso.
Linha 3 - Incluímos o arquivo config_upload.inc para ser utilizado junto ao script atual, acessando os valores das variáveis definidas nele.
Linhas 5, 6 e 7 - Aqui utilizamos o array superglobal $_FILES, para obter informações sobre o arquivo o qual vamos realizar o upload. Esse array possui duas dimensões, a primeira identifica o arquivo e a segunda é o nome da propriedade que desejamos obter o valor.
Segue alguns elementos que ficam disponíveis ao utilizarmos o array superglobal $_FILES, nem todos utilizamos em nosso exemplo, mas posteriormente você pode modificar o artigo e testar todos eles:
Utilizados:
$_FILES['arq_imagem']['name'] - Identifica o nome original do arquivo no computador do usuário.
$_FILES['arq_imagem']['size'] - Identifica o tamanho do arquivo em bytes.
$_FILES['arq_imagem']['tmp_name'] - Identifica o nome temporário que o servidor utilizou para armazenar o arquivo.
Não utilizados em nosso exemplo:
$_FILES['arq_imagem']['type'] - Caso exista, mostra o tipo MIME(Multipurpose Internet Mail Extensions) do arquivo, ex: uma imagem png retornaria o valor "image/png".
$_FILES['arq_imagem']['error'] - Contém o código de erro caso aconteça alguma falha na execução do upload.
Linha 10 - Aqui fazemos uso da função empty($nome_arquivo), em negação !empty($nome_arquivo), o que significa que verificamos se a variável é o contrário de vazia, o mesmo que dizer que estamos verificando se a variável está preenchida. Estando a variável preenchida caímos dentro do IF.
Linha 11 - Utilizamos a função strrchr($nome_arquivo, '.') para retornarmos parte da variável indicada iniciada no '.' (ponto) em diante, jogando o seu retorno na variável $ext.
Da linha 13 até a 26 - Realizamos as validações necessárias utilizando as variáveis contidas no arquivo config_upload.inc, na linha 13 a 15 verificamos se está sendo limitada as extensões do arquivo e quais extensões são permitidas, linha 17 a 19 verificamos se não é permitido sobrescrever o arquivo e se o mesmo já existe no diretório de salvamento, da linha 21 a 26 verificamos se estamos limitando o tamanho do arquivo e comparamos o tamanho do arquivo enviado para o upload.
Linha 28 a 34 - Movemos o arquivo para o diretório desejado através da função move_uploaded_file() , ou seja, realizamos o upload e verificamos através do IF o seu resultado exibindo a mensagem adequada.
Linha 35 a 37 - Exibe uma resposta para o usuário, caso ele não tenha informado um arquivo para o upload, o que é verificado na linha 10, aqui retornamos uma resposta caso contrário - utilizando um ELSE, a verificação da linha 10.
PS: Visualizamos dentro do script muitas vezes a ocorrência da função die(), caso você não conheça, ela serve para encerrar o script e emitir uma mensagem desejada.
4 - Verificando o resultado
Para testarmos acesse a página upload.html no localhost da sua máquina ou no caminho do servidor de hospedagem. Você deverá visualizar a página conforme abaixo:
Agora basta selecionar o arquivo e clicar no botão Enviar, como resultado adequado resultará na página abaixo.
Para fins de estudo, segue um arquivo compactado com todos os arquivos desse tutorial: upload.rar.
PS: Lembrando que neste artigo não abordamos a questão de SEGURANÇA no upload, aqui mostramos apenas como o processo de upload de um arquivo é realizado. Caso você precise implementar um upload de arquivo em algum local, pesquise mais a respeito, se faz necessária alterações nos scripts disponibilizados, para que sejam evitados ataques e se mantenha a segurança do seu sistema. Em breve essa questão também será tratada nos próximos tutoriais. Agradecemos ao usuário JRZcn do reddit quanto a essa observação.
Também vamos disponibilizar um novo artigo mostrando como cadastrar imagem no banco de dados e recuperá-la na para uso.