ULTIMATE PHP Blog

Conheça 15 Ferramentas Essenciais Para PHP
15 Ferramentas Essenciais Para PHP

Coloque seu e-mail abaixo e baixe agora um PDF 100% gratuito mostrando 15 ferramentas indispensáveis para PHP

Fique tranquilo. Odeio spam tanto quanto você :)

Upload de Arquivo com PHP

Upload de Arquivo com PHP

Por meio de formulário, podemos permitir que usuários enviem arquivos para nossa aplicação.

NOTA: Este artigo é um excerto do Curso ULTIMATE PHP 2.0. Para conhecer todos os detalhes do curso, clique aqui.

Trabalhar com upload é muito simples. O PHP faz quase todo o trabalho para nós. Ele toma conta do envio do arquivo até o servidor, salvando esse arquivo em uma pasta temporária do sistema.

Em ambientes Linux, essa pasta é, normalmente, o /tmp. Já em Windows, geralmente é o C:\tmp. Mas isso é configurável no php.ini.

Detalhes Importantes Sobre Upload de Arquivo

Antes de fazermos o primeiro upload, é importante ressaltar alguns detalhes importantíssimos sobre upload, HTML e PHP.

Atributo enctype

Para que uploads funcionem, precisamos adicionar um atributo a mais na tag form: o atributo enctype, com o valor multipart/form-data.

<input type="file" name="arquivo" enctype="multipart/form-data">

Outro detalhe é que para uploads, é imprescindível que o formulário utilize o método POST. Não é possível fazer upload usando o método GET.

As Diretivas do php.ini

Duas diretivas do arquivo php.ini influenciam o envio de arquivo no PHP: post_max_size e upload_max_filesize.

O valor de upload_max_filesize corresponde ao tamanho do arquivo enviado. Já post_max_size corresponde ao tamanho total dos valores enviados por POST. Isso significa que post_max_size deve ter valor igual ou superior ao valor de upload_max_filesize.

É possível alterar os valores dessas diretivas diretamente no php.ini ou pelo .htaccess, desta forma:

php_value upload_max_filesize 20M
php_value post_max_size 40M

Formulário de Upload

Vamos ao nosso formulário de upload.

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Upload de arquivo</title>
    </head>
    <body>
        <h1>Upload de Arquivo com PHP</h1>

        <form action="upload.php" method="post" enctype="multipart/form-data">
            <input type="file" name="arquivo">
            
            <input type="submit" value="Enviar">
        </form>

    </body>
</html>

Script de Upload

No arquivo upload.php, vamos dar um print_r no array $_FILES, que é quem armazena os dados do(s) arquivo(s) enviado(s).

<?php
print_r($_FILES);

Após enviar um arquivo, a saída será parecida com esta:

Array
(
    [arquivo] => Array
    (
        [name] => arquivo.pdf
        [type] => application/pdf
        [tmp_name] => /private/var/folders/pf/yk80714j0s715klrrzm38_f80000gn/T/php1T7TkD
        [error] => 0
        [size] => 8735757
    )
)

O índice arquivo corresponde ao atributo name do input do tipo file.

Os elementos do array significam o seguinte:

  • name: Nome original do arquivo no computador do usuário
  • type: Mime-type do arquivo enviado
  • tmp_name: Caminho do arquivo enviado na pasta temporária do servidor
  • error: Código do erro durante o envio, ou 0 se o upload ocorreu sem erros
  • size: Tamanho do arquivo, em bytes

Mais detalhes sobre cada um desses valores, além dos possíveis códigos de erros, podem ser vistos na documentação do PHP sobre envio de arquivos.

Ou seja, o PHP já enviou o arquivo, colocando-o em um local temporário. A única coisa que nosso script precisa fazer é mover esse arquivo para o local desejado.

Para isso, é possível usar a função copy(), mas é recomendado, em caso de upload, usar a função move_uploaded_file().

Basta mover o arquivo que está no valor de tmp_name para o local desejado.

Eu criei uma pasta chamada arquivos (no mesmo local onde está o upload.php), para que todos os uploads sejam salvos nela.

Nosso script de upload ficará assim:

<?php

// diretório de destino do arquivo
define('DEST_DIR', __DIR__ . '/arquivos');

if (isset($_FILES['arquivo']) && !empty($_FILES['arquivo']['name']))
{
    // se o "name" estiver vazio, é porque nenhum arquivo foi enviado
    
    // apenas para facilitar, criamos uma variável que é o array com os dados do arquivo
    $arquivo = $_FILES['arquivo'];

    if (!move_uploaded_file($arquivo['tmp_name'], DEST_DIR . '/' . $arquivo['name']))
    {
        echo "Erro ao enviar arquivo";
    }
    else
    {
        echo "Arquivo enviado com sucesso";    
    }
}

Esse script salva na pasta arquivos o arquivo enviado com o nome original.

Portanto, se alguém enviar um arquivo com o mesmo nome, o primeiro será apagado.

Por esse motivo, normalmente geramos nomes aleatórios para os arquivos. Isso evita que um sobrescreva o outro.

Gerando Nomes Únicos Para os Arquivos

Para gerar um nome aleatório, podemos usar a função uniqid() e concatenar o valor gerado à extensão do arquivo.

O script ficará assim:

<?php

// diretório de destino do arquivo
define('DEST_DIR', __DIR__ . '/arquivos');

if (isset($_FILES['arquivo']) && !empty($_FILES['arquivo']['name']))
{
    // se o "name" estiver vazio, é porque nenhum arquivo foi enviado
    
    $arquivo = $_FILES['arquivo'];

    // pega a extensão do arquivo
    $ext = explode('.', $arquivo['name']);
    $ext = end($ext);

    // gera o novo nome
    $novoNome = uniqid() . '.' . $ext;

    if (!move_uploaded_file($arquivo['tmp_name'], DEST_DIR . '/' . $novoNome))
    {
        echo "Erro ao enviar arquivo";
    }
    else
    {
        echo "Arquivo enviado com sucesso, com o nome:: " . $novoNome;    
    }
}

Para gerenciar corretamente os arquivos, é possível salvar no banco de dados o nome original e vinculá-lo com o nome gerado.

Caso tenha dúvidas em como salvar e buscar informações em um banco de dados, recomendo que leia este artigo.

Se você precisar enviar diversos arquivos de uma só vez, leia este artigo sobre upload múltiplo com PHP.

E aí, o que achou do artigo? Deixe sua opinião ou dúvida aqui nos comentários!

Bons estudos!

NOTA: Este artigo é um excerto do Curso ULTIMATE PHP 2.0. Para conhecer todos os detalhes do curso, clique aqui.

Aprenda Ainda Mais

15 Dicas, Boas Práticas e Fundamentos do PHP

Conheça Dicas FUNDAMENTAIS para programar em PHP de forma Profissional

Não se considere Programador PHP sem antes ler este guia e adotar estas práticas!

Baixe gratuitamente este guia com 15 Dicas de PHP

Sobre Roberto Beraldo
Desenvolvedor Web desde 2007, com foco em PHP. Criador do Curso ULTIMATE PHP e autor do Blog do Beraldo (rberaldo.com.br), onde compartilha dicas sobre PHP e Programação em geral.